繁体   English   中英

C 质数错误

[英]C prime number bug

我想使用平方根方法查找数字是否为质数。 当我测试它时,我的号码对于不同的号码工作正常,但我知道有一个我找不到的错误。 任何帮助将不胜感激。

#include <math.h>

int is_prime(int n)
{
    int i,root;

    if(n == 2){
        return 1;
    }
    if(n % 2 == 0){
        return 0;
    }

    root = sqrt(n);

    for(i = 3; i <= root; i = i + 2){
        if(n % i == 0){
            return 0;
        }
    }

    return 1;
}

int main()
{
    int n,m;

    while (1){
        printf("Please enter a number(enter 0 to exit):");
        scanf("%d", &n);
        if(n == 0){
            break;
        }
        if(1 == is_prime(n)){
            printf("%d is a prime number.\n", n);
        }
        else{
            printf("%d is not a prime number.\n", n);
        }
    }

    return 0;
} 

有一个我找不到的错误

注意浮点数学的微妙之处

root = sqrt(n); 由于不精确/四舍五入,可能会导致root比预期小 1。 示例:考虑sqrt(49)可能返回 6.999999999999999...使root = 6 循环在使用 7 进行测试之前停止,并错误地将prime(49)返回为 true。

而是迭代直到商太大。 i大约是n平方根时,这就会成立。

// for(i = 3; i <= root; i = i + 2){
for(i = 3; i <= n/i; i = i + 2){

避免以下情况,因为i*i可能会溢出INT_MAX附近的素数。

for(i = 3; i*i <= n; i = i + 2){  // Potential overflow

当接近n%i时, n/i通常是“免费赠品”,因为好的编译器会发出通用的高效代码。

或者,如果必须使用sqrt() ,则将平方根计算四舍五入。 对于long long n等其他类型,这可能是不够的。 最好对整数问题使用整数数学。

root = ceil(sqrt(n));

角落错误

代码为is_prime(1)返回 true。 @Weather Vane建议最后回归:

// return 1;
return n >= 2;

当尝试sqrt(negative_odd)代码以is_prime(negative_odd) 建议sqrt() -less 解决方案。

可能存在其他问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM