我遇到一个函数检查一个数字是否为素数时遇到问题 - 当有时这个数字是正数时它会返回一个数字(有时也是偶数数字!)。知道为什么吗?
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
可悲的是,我的白痴已经达到了新的高度,我发现错误在我的程序中的其他地方。
答案 0 :(得分:3)
可能是因为此函数调用导致sqrt(x)
的舍入是浮点值。所以它可以小于舍入到最接近的整数。
在这种情况下,例如sqrt(25)
可以四舍五入为4
而不是5
。
修改强>
104730
上的错误号告诉
if(!(x&1)) return 0; //if x is even return false
似乎无法正常工作......那么,您可以尝试x&1L
吗?
我不确定,但是int
和long
的大小不同,而且(可能)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整除。