我的质数检查器功能无法正常工作

my prime number checker function not working properly

所以这个函数应该 return 如果不是素数则为 0,如果素数则为 1。我看错了吗?例如,当我给它 39 时,它说 returns 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;
            }

    }
    }


}

关于:

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

变量:loop_counter 未初始化(甚至未声明)

也许你的意思是:

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

建议代码如下:

  1. 干净地编译
  2. 执行所需的功能
  3. 不是 fastest/best 检查数字是否为素数的方法。相反,它是一种蛮力方法

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;
}

在这个循环中

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,则变量 prime 的值为 0,并且由于循环中的条件,循环停止迭代。

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

也可以改写成

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