素数检查码的奇怪情况

qua*_*cat 8 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;
}
Run Code Online (Sandbox Code Playgroud)

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

for(i = 2; i <= sq+1; i++)   // or even sq+2, sq+3, etc.
Run Code Online (Sandbox Code Playgroud)

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

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

Hen*_*nry 9

如果你将循环更改为

for(i = 2 ; i <= sq+1 ; i++)
Run Code Online (Sandbox Code Playgroud)

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

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


Pat*_*rts 6

考虑到你从变化的总和142913828922142913828920,然后不同的是2,这意味着你解释2为不是素数.更改sqsq+1要实现这一目标的差别.改变它最终sq+2会变得3不是素数.

((int)sqrt(2))+1 == 2
((int)sqrt(3))+2 == 3
Run Code Online (Sandbox Code Playgroud)

等等.