为什么在某些非素数上检查素数是否正确?

时间:2013-04-25 06:23:51

标签: c

我遇到一个函数检查一个数字是否为素数时遇到问题 - 当有时这个数字是正数时它会返回一个数字(有时也是偶数数字!)。知道为什么吗?

int isPrime(long x){
    int i;

    if(x==2||x==3)      return 1;   //if i = 2 or 3, return true
    if(!(x&1))          return 0;   //if x is even  return false

    for(i=3;i<=sqrt(x);i+=2) if (x%i == 0) return 0;        //if x is divisible by i return false

    return 1;
}

对于每个人,非常感谢答案,如果我的代表足够高,我会把它们全部+1:D

可悲的是,我的白痴已经达到了新的高度,我发现错误在我的程序中的其他地方。

3 个答案:

答案 0 :(得分:3)

可能是因为此函数调用导致sqrt(x)的舍入是浮点值。所以它可以小于舍入到最接近的整数。

在这种情况下,例如sqrt(25)可以四舍五入为4而不是5

修改

104730上的错误号告诉

 if(!(x&1)) return 0;   //if x is even  return false

似乎无法正常工作......那么,您可以尝试x&1L吗?

我不确定,但是intlong的大小不同,而且(可能)1隐含地属于较短的一种类型,因此可能检查错误的位......

也可以尝试

if(!(x%2)) return 0;   //if x is even  return false

为了避免位模式使用和平台依赖。

答案 1 :(得分:0)

我将for循环编辑为:

for(i=3;i<=x/2;i+=1) if (x%i == 0) return 0; 

在主要内容中,我将通过前100个数字。

int main()
{
    long test=0;
    int i = 2;
    for( ; i < 100; i++)
    {
        test = isPrime(i);
        if(test == 1) printf("%d ",i);
    }

       getchar();
       return 0;
}

这是输出: 这是前100个素数的输出:

2 3 5 7 11  13  17 19 23 29  31 37 41 43 47  53 59 61 67 71  73 79 83 89 97

我将i+=2更改为i+=1,因为在您的代码中跳过每隔一个数字。

答案 2 :(得分:-1)

您没有检查x是否可以被2整除。

for循环之前添加return 0,如果它可以被2整除。