用户输入大数时无限循环

时间:2019-03-04 06:42:46

标签: c++

我正在编写一个名为largestTwinPrime的函数,该函数接受两个数字,并在两个数字之间找到最大的双素数。我的程序可以工作,但是当用户输入足够多的数字时,程序将变成无限循环。例如:

  • largestTwinPrime(0,15485661)会给我这个错误“程序超出了其时间限制并已停止(可能无限循环)”。
  • largestTwinPrime(1,18)将输出17。

这是我拥有的代码,感谢您的帮助!

(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;
}

1 个答案:

答案 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),并使用它来加快质数的验证。