素数检查码

时间:2016-01-24 08:57:30

标签: c algorithm primes

当我为Project Euler解决问题时,它要求我总结200万以下的所有素数。这是我的代码:

#include<stdio.h>
#include<math.h>
int isPrime(int);
int main() {
    long long int sum = 0;
    int i; // index
    for(i = 2 ; i < 2000000 ; i++) {
        if(isPrime(i)) {
            sum += i;
        }
    }
    printf("%lli\n", sum);
}

int isPrime(int num) {
    int i; // index
    int sq = sqrt(num);
    for(i = 2 ; i <= sq ; i++) {
        if(num % i == 0) {
            return 0;
        }
    }
    return 1;
}

此代码导致正确答案,142913828922。 但是当我将isPrime()中的for循环更改为:

for(i = 2; i <= sq+1; i++)   // or even sq+2, sq+3, etc.

导致错误的结果,如142913828920和142913828917等。

为什么会出错?从理论上讲,它不会将isPrime()发送的数量更改为main(),是吗?

3 个答案:

答案 0 :(得分:9)

如果您将循环更改为

for(i = 2 ; i <= sq+1 ; i++)

然后2不再被认为是素数,因为你测试2 % 2 == 0

类似于您添加的较大数字,将不会检测到越来越多的素数。

答案 1 :(得分:6)

考虑到您将总和从142913828922更改为142913828920,则差异为2,这意味着您将2解释为非素数。将sq更改为sq+1应该可以实现这一差异。将其更改为sq+2最终会导致3无法使用。

((int)sqrt(2))+1 == 2
((int)sqrt(3))+2 == 3

等等。

答案 2 :(得分:1)

最好使用

for(i = 2 ; i*i <= num ; i++) {
    if(num % i == 0) {
        return 0;
    }
}

而不是

int sq = sqrt(num);
for(i = 2 ; i <= sq ; i++) {
    if(num % i == 0) {
        return 0;
    }
}

以避免sqrt函数的问题