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.

您可以使用调试器自己发现这一点。