C - next_prime 函数有时会在使用 if(input=prime) 限制时失败
C - next_prime function fails on occasion when limited by if(input=prime) is used
此代码对某些素数(7、13、19..)无效,但对不同的素数(5、11、17..)有效。没有基本条件,它每次都有效, is_prime 功能也是如此。我条件写的不好吗?如果输入数字是素数,它应该 return 下一个素数,如果不是,它应该是 return -1。
int next_prime(int prime) {
int c;
if(is_prime(prime) == 0)
return -1;
if(prime < 2)
c = 2;
else if (prime == 2)
c = 3;
else if(prime & 1){
prime += 2;
c = is_prime(prime) ? prime : next_prime(prime);
} else
c = next_prime(prime-1);
return c;
}
编辑:is_prime
对所有试过的数字都进行了处理,我相信它是正确的。
int is_prime(int num){
if(num == 1)
return 0;
if((num & 1)==0)
return num == 2;
else {
int i, limit = sqrt(num);
for (i = 3; i <= limit; i+=2){
if (num % i == 0)
return 0;
}
}
return 1;
}
你的 next_prime
功能有点奇怪而且过于复杂,你为什么不直接使用这个:
int next_prime(int prime) {
while (!is_prime(++prime))
{
}
return prime;
}
这发生在您的 next_prime
函数中:
假设您调用 next_prime(7)
:
int next_prime(int prime) {
int c;
if (is_prime(prime) == 0)
return -1;
if (prime < 2)
c = 2;
else if (prime == 2)
c = 3;
else if (prime & 1) {
prime += 2;
c = is_prime(prime) ? prime : next_prime(prime);
}
else
c = next_prime(prime - 1);
return c;
}
前三个测试中的 None 为真,我们最终得到 else if (prime & 1)
。此测试为真,因此将执行以下行:
prime += 2; // prime becomes 9 (7 + 2)
is_prime(9)
是假的所以你执行 next_prime(9)
c = is_prime(prime) ? prime : next_prime(prime);
和next_prime(9)
显然会return -1.
您可以使用调试器自己发现这一点。
此代码对某些素数(7、13、19..)无效,但对不同的素数(5、11、17..)有效。没有基本条件,它每次都有效, is_prime 功能也是如此。我条件写的不好吗?如果输入数字是素数,它应该 return 下一个素数,如果不是,它应该是 return -1。
int next_prime(int prime) {
int c;
if(is_prime(prime) == 0)
return -1;
if(prime < 2)
c = 2;
else if (prime == 2)
c = 3;
else if(prime & 1){
prime += 2;
c = is_prime(prime) ? prime : next_prime(prime);
} else
c = next_prime(prime-1);
return c;
}
编辑:is_prime
对所有试过的数字都进行了处理,我相信它是正确的。
int is_prime(int num){
if(num == 1)
return 0;
if((num & 1)==0)
return num == 2;
else {
int i, limit = sqrt(num);
for (i = 3; i <= limit; i+=2){
if (num % i == 0)
return 0;
}
}
return 1;
}
你的 next_prime
功能有点奇怪而且过于复杂,你为什么不直接使用这个:
int next_prime(int prime) {
while (!is_prime(++prime))
{
}
return prime;
}
这发生在您的 next_prime
函数中:
假设您调用 next_prime(7)
:
int next_prime(int prime) {
int c;
if (is_prime(prime) == 0)
return -1;
if (prime < 2)
c = 2;
else if (prime == 2)
c = 3;
else if (prime & 1) {
prime += 2;
c = is_prime(prime) ? prime : next_prime(prime);
}
else
c = next_prime(prime - 1);
return c;
}
前三个测试中的 None 为真,我们最终得到 else if (prime & 1)
。此测试为真,因此将执行以下行:
prime += 2; // prime becomes 9 (7 + 2)
is_prime(9)
是假的所以你执行 next_prime(9)
c = is_prime(prime) ? prime : next_prime(prime);
和next_prime(9)
显然会return -1.
您可以使用调试器自己发现这一点。