Числа 3, 5 и 7 не отображаются как простые

0

Мне нужно создать функцию, которая генерирует простые числа между двумя номерами ввода. Я делаю это, проверяя примат каждого числа в диапазоне. Проблема в том, что числа 3, 5 или 7 никогда не отображаются. Я не уверен, что случилось.

Вот как я проверяю примитивность числа:

bool isPrime(int number){
    using namespace std;
    if((number%2==0) || (number%3==0) || (number%4==0) || (number%5==0) ||
       (number%6==0) || (number%7==0) || (number%8==0) || (number%9==0))
    {
        return false;
    }
    else if ((number/1==number) && (number/number==1))
    {
        return true;
    }
}
Теги:
algorithm
math
primes

5 ответов

3

3 является кратным 3. 5 кратно 5. 7 кратно 7. Вы написали код, который возвращает false для любого кратного 3, 5 или 7, поэтому он не может вернуть true для этих чисел. Вам нужно только проверить делимость на простые числа меньше, чем число, которое вы проверяете.

Вы также проверяете делимость множеством ненужных составных чисел; например, число не может быть кратным 4, не будучи кратным 2, и оно не может быть кратным 6, не будучи кратным 2 и 3. Эти проверки ничего не делают, кроме времени отходов.

Наконец, ваш код ошибочен в 100% случаев в конечном счете, потому что его максимальное количество, которое он проверяет, равно 7. Он скажет, что 169 (13 * 13) является простым, потому что он не делится ни на один из номеров, которые вы проверяете, но он явно композит. Для пробного деления вам нужно проверить все простые числа, которые меньше или равны полам (sqrt (n)), либо выполняя много ненужных проверок против композитов, либо создавая список простых чисел, когда вы идете (сродни Сито Эратосфена, которое часто называют его по типам CS, но я не считаю его строго эквивалентным).

  • 0
    Математически вам нужно только проверить все числа, которые меньше квадратного корня (округленное целое число) проверяемого числа. Если ничто не является кратным до этого, то ничто не будет потом.
  • 0
    @ZacHowland правда, я исправлю.
Показать ещё 2 комментария
1

Очень простой (и не все такой эффективный) метод:

bool is_prime(int i)
{
    int root = (int)std::sqrt(i);
    bool result = true;
    for (int j = 2; j <= root; ++j)
    {
        if (i % j == 0)
        {
            result = false;
            break;
        }
    }
    return result;
}
  • 2
    Давай, не корми ложкой ...
  • 0
    @MattiVirkkunen Я чувствовал себя довольно щедрым ...
Показать ещё 2 комментария
0

Вы можете взглянуть на эту статью.

Это систематический способ нахождения простых чисел. Используйте этот алгоритм для поиска простых чисел, пока не достигнете верхнего значения входов.

0

Или вы можете использовать этот алгоритм:

#include<iostream>
#include<string>
#include<cmath>

using namespace std;

int main()
{
    int num;
    int count = 0;

    cout << "Enter your range: ";
    cin >> num;

    for(int i = 1; i <= num; i++)
    {
        count = 0;
        for(int j = 2; j <= sqrt(i); j++)
        {
            if(i % j == 0)
            {
                count++;
                break;
            }
        }
        if(count == 0 && i != 1)
            cout << i << "   ";
    }
    cout << endl;   
}
  • 0
    1. повторно вычислять sqrt очень плохо. 2. Использование счета тоже не хорошо. Если int n> = 2 имеет делитель между 2 и sqrt (n), то вы можете сразу сделать вывод, что это не простое число
0

Посмотрите на эту строку кода:

if((number%2==0) || (number%3==0) || 
   (number%4==0) || (number%5==0) ||
   (number%6==0) || (number%7==0) ||
   (number%8==0) || (number%9==0))
   return false;

Подумайте, что произойдет, если вы подключите 2, 3, 5 или 7. В каждом случае вы обнаружите, что число, mod 2, mod 3, mod 5 или mod 7 действительно равны нулю, поэтому ваш код вернется ложный. Это, вероятно, объясняет, почему вы получаете эти цифры, не считая их просто расценками.

Но теперь посмотрим на следующее утверждение:

else if ((number/1==number) && (number/number==1)){
    return true;
}

В каких случаях это будет ложным? Каждое число, деленное на одно, само по себе, и каждое число, деленное на себя, равно единице, поэтому каждое число проходит этот тест. Таким образом, ваш код вернет true для любого числа, если он не делится на 2, 3, 4, 5, 6, 7, 8 или 9. Попробуйте подключить 11 x 13 = 143. Это число isn ' t prime, но ваша функция скажет, что это так.

Другие опубликовали другие маршруты, которые вы можете предпринять, чтобы решить проблему, но в принципе я думаю, что проблема в том, что число является простым, если нет чисел, отличных от 1, и само по себе являются делителями. Ваша функция каким-то образом должна будет учитывать это, возможно, путем проверки всех номеров ниже нее, которые не являются ни одним, ни самим собой. Можно оптимизировать это дальше, как предложили некоторые ответы, но вы должны знать, что на базовом уровне это то, что нужно сделать.

Надеюсь это поможет!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню