为什么这段代码不像我需要的那样快?

时间:2014-08-09 04:09:14

标签: c++ double

我能够让它在1.65秒内运行,但我觉得它可能会更快。双打可能吗?

#include<iostream>
using namespace std;

bool isPrime(int n) {
    if(n%2 == 0 && n!=2) return false;
    for(int i=3; i<n/2; i++) {
        if(n%i == 0) return false;
    }
    return true;
}

int main() {
    int num, i; 
    i=1000000007;
    num = 1000000008;
    for(;i<num; i++) {
        if(isPrime(i)) cout << i << endl;
    } 
    return 0;
}

1 个答案:

答案 0 :(得分:4)

&#34; isPrime&#34;中的for循环没有增量。你有:

for(int i=3; i<n/2;)

你应该:

for(int i=3; i<n/2; i++)

编辑:由于评论者提出了优化,因此您可以轻松做两件事,并大大减少大值n的操作次数。

第一个是,如评论所示,将i递增2(我将按原样保留答案,因为问题的关键是&#34;为什么代码不起作用&#34;而不是&#34; #34;如何优化代码,以及新手程序员更容易以最简单的形式查看修复程序,因为您已经知道已经从先前的条件中删除了所有偶数

第二种是仅检查n的平方根而不是n除以2.原因如下:如果n不是素数,则有两个大于1且小于n的数满足条件

n = x * y

如果x和y都大于n的平方根,那么x * y大于n。因此,如果你没有找到任何因素,你迭代超过n的平方根,则n是素数。