我正在编写一个名为largestTwinPrime的函数,该函数接受两个数字,并在两个数字之间找到最大的双素数。我的程序可以工作,但是当用户输入足够多的数字时,程序将变成无限循环。例如:
这是我拥有的代码,感谢您的帮助!
(isPrime)
int isPrime(int num){
if(num <= 1) return 0;
for (int i = 2; i * i <= num; i++){
if (num % i == 0) return 0;
}
return 1;
}
(isTwinPrime)
bool isTwinPrime(int n){
if(n <= 1) return 0;
if(isPrime(n+2)==true && isPrime(n)==true){
return 1;
} else if(isPrime(n-2)==true && isPrime(n)==true){
return 1;
} else{
return 0;
}
}
(largestTwinPrime)
int largestTwinPrime(int a, int b){
int answer=0;
while(a <= b){
for(int i = a; i <= b; i++){
if(isTwinPrime(i)== true){
answer = i;
}
}
a++;
}
if(answer==0) return -1;
else return answer;
}
答案 0 :(得分:0)
您的代码的复杂性非常差。您的代码正在调用isTwinPrime
O(n 2 )次,总计超过O(n 2.5 )次。这使它看起来像一个无限循环:
while(a <= b){ // O(N) iterations
for(int i = a; i <= b; i++){
// times O(N) = O(N**2)
if(isTwinPrime(i)== true){ // The call is over O(sqrt(N))
answer = i;
}
}
a++;
}
正确的代码是:
int largestTwinPrime(int a, int b){
int answer=0;
if (b < 5) return -1;
// A twin prime is odd, so go over odd values.
if (b %2 == 0) b--;
for(int i = b; i >= a; i-=2){
if(isTwinPrime(i))
return i;
}
return -1;
}
复杂度降低了O(N)。
此外,您的isPrime效率低下。最好在sqrt(N)以下填充一个质数向量(使用Sieve of Eratosthenes),并使用它来加快质数的验证。