[英]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.