使用此主要查找器功能改进和绕过超时错误测试的任何建议?

any suggestions to improve and bypass timeout error test with this prime finder function?

我应该创建一个函数来为给定数字找到最接近的下一个素数,我的意思是即使算法写得不好而且非常慢(可能是最慢的),但它完成了任务,问题是应该评估我的东西的程序因超时错误而拒绝它,他一次给了它一堆数字,他希望它们在 10 秒内全部解决,所以问题是你可以提出任何改进建议可以快进我可怜的曲折吗? (for 不允许)

int is_prime(int nb)
{
    int i;
    /* if negative terminate */
    if (nb <= 1)
        return (0);
    /* start from first prime */ 
    i = 2;
   /* primes equals zero only when divisible by 1 and theme-selves */
    while (nb % i != 0)
        i++;
    /* if i divides nb, we see if i is the nb we looking for */
    if (i == nb)
        return (1);
    else
        return (0);
}

int find_next_prime(int nb)
{
    int i;

    i = 0;
    /*keep looking for primes one by one */
    while (!is_prime(nb + i))
        i++;
    return (nb + i);
}

您错过了两个最常用的提高速度的技巧。

  • 你只需要检查数字的平方根
  • 一旦你检查了 2,你只需要检查从 3 开始的每个其他号码。

最简单的速度改进是检查直到 n 的平方根的除数,而不是检查直到 n 的所有除数。这使算法从 O(nb) 到 O(sqrt(nb))。

考虑 is_prime(2147483647)。 OP 的方法大约需要 2147483647 次迭代。测试平方根 46341 大约快 46,000 倍。

// while (nb % i != 0) i++;
// if (i == nb) return (1);
// else return (0);

// While the divisor <= quotient (or until the square root is reached)
while (i <= nb/i) {
  if (nb%i == 0) return 1;
  i++;
}
return 0;

避免 i*i <= nb 测试,因为 i*i 可能会溢出。
避免 sqrt(nb) 因为涉及大量浮点/int 问题。
注意:优秀的编译器会查看附近的 nb/i; nb%i 并计算它们的时间成本。

还有很多其他的改进是可能的,但我想专注于一个简单但影响很大的改进。当想要提高速度时,请专注于降低复杂性的顺序 O() and not linear improvements. Is premature optimization really the root of all evil?