我期待着改进我的算法,找到给定数字右边的下一个黄金编号。 到目前为止我所拥有的是:
int NextPrime(int a)
{
int i, j, count, num;
for (i = a + 1; 1; i++)
{
for (j = 2, count = 0; j <= i; j++)
{
if (i%j == 0)
{
count++;
}
}
if (count == 1)
{
return i;
break;
}
}
}
这种算法在经常运行时效率不高。 有人可以提出有关如何加速或改进算法的建议。
答案 0 :(得分:8)
bool IsPrime(int number)
{
if (number == 2 || number == 3)
return true;
if (number % 2 == 0 || number % 3 == 0)
return false;
int divisor = 6;
while (divisor * divisor - 2 * divisor + 1 <= number)
{
if (number % (divisor - 1) == 0)
return false;
if (number % (divisor + 1) == 0)
return false;
divisor += 6;
}
return true;
}
int NextPrime(int a)
{
while (!IsPrime(++a))
{ }
return a;
}
最终结果是,这个循环在我尝试的几个大数字上运行得非常快。
答案 1 :(得分:3)
如果您只检查每个素数之前的每个数字,直到素数的平方根,您可以大量改进Eratosthenes的筛子。为此,您需要保留所有素数的列表。这会增加内存成本,但会提高执行速度。
伪代码:
List foundPrimes;
foundPrimes.add(1)
foundPrimes.add(2)
bool isPrime(int x) {
for (int divisor in foundPrimes) {
if (divisor*divisor > x) {
foundPrimes.add(x);
return true;
} else if (x % divisor==0) {
return false;
}
}
// Invalid, need to run the algo from 3 on to fill the list
}
int nextPrime(int x) {
while (!isPrime(++x)) {}
return x;
}