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

因此,如果不是素数,则此函数仅应返回0,如果素数则应返回1。我看错了吗?例如,当我给它39时,它说尽管39不是素数,但它返回1。

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

    }
    }


}
gangzai981760123 回答:我的素数检查器功能无法正常工作

在此循环中

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 )
                          ^^^^^^^^^^
,

关于:

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

变量loop_counter尚未初始化(甚至没有声明)

也许你是说:

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

以下建议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 不是检查数字是否为质数的最快/最佳方法。而是一种蛮力方法

OPs发布的代码存在一些问题,如对OPs问题的注释中所述,因此在此不再赘述。

现在,建议的代码:

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

    return 1;
}
本文链接:https://www.f2er.com/3150903.html

大家都在问