моя функция проверки простых чисел не работает должным образом - PullRequest
1 голос
/ 06 ноября 2019

Итак, эта функция должна возвращать 0, если не простое число, и 1, если простое число. Я вижу что-то не так? например, когда я даю ему 39, он говорит, что возвращает 1, хотя 39 не простое число.

int is_prime(int number){
    if (number == 2) {
        return 1;
    }

    else{
        for(loop_counter ; loop_counter < number ; loop_counter++){

            if(number%loop_counter == 0){
                return 0;

            }
            else{
                return 1;
            }

    }
    }


}

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

В этом цикле

for(loop_counter ; loop_counter < number ; loop_counter++){

используется необъявленная переменная loop_counter. Если это глобальная переменная, то она не должна использоваться в функции, потому что, по крайней мере, неясно, каково ее значение.

Также внутри цикла вы прерываете его итерации, как только number%loop_counter != 0. Но это не означает, что число простое.

И если пользователь передаст отрицательное число или ноль, то функция будет иметь неопределенное поведение.

Функция может быть определена следующим образом

int is_prime( unsigned int n )
{
    int prime = n % 2 == 0 ? n == 2 : n != 1;

    for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
    {
        prime = n % i != 0;
    }

    return prime;
}

Функция сначала исключает все четные числа, кроме 2, поскольку четные числа не являются простыми числами. И это также исключает число 1, потому что число 1 не является простым по определению.

int prime = n % 2 == 0 ? n == 2 : n != 1;

Так что в цикле нет смысла рассматривать делители, которые являются четными.

    for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
                                                   ^^^^^^

Затем в цикле проверяется, делится ли данное нечетное число n на нечетный делитель

        prime = n % i != 0;

Если n % i равно 0, тогда переменная премьер получаетзначение 0 и цикл останавливает свои итерации из-за условия в цикле.

for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
                          ^^^^^

, которое можно переписать также как

for ( unsigned int i = 3; prime != 0 && i <= n / i; i += 2 )
                          ^^^^^^^^^^
0 голосов
/ 06 ноября 2019

относительно:

for(loop_counter ; loop_counter < number ; loop_counter++){

переменная: loop_counter не инициализирована (и даже не объявлена)

Возможно, вы имели в виду:

for( int loop_counter = 0; loop_counter < number ; loop_counter++){

Следующее предложенноекод:

  1. безупречная компиляция
  2. выполняет желаемую функциональность
  3. НЕ является самым быстрым / лучшим способом проверки, является ли число простым. Скорее, это метод грубой силы

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

Теперь предложенный код:

int is_prime(int number)
{
    for( int loop_counter = 2 ; loop_counter < number ; loop_counter++)
    {
        if(number%loop_counter == 0)
        {
            return 0;
        }
    }

    return 1;
}
...