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(),是吗?
如果你将循环更改为
for(i = 2 ; i <= sq+1 ; i++)
Run Code Online (Sandbox Code Playgroud)
然后2不再被认为是素数,因为你测试是否2 % 2 == 0.
类似于您添加的较大数字,将不会检测到越来越多的素数.
考虑到你从变化的总和142913828922来142913828920,然后不同的是2,这意味着你解释2为不是素数.更改sq到sq+1要实现这一目标的差别.改变它最终sq+2会变得3不是素数.
((int)sqrt(2))+1 == 2
((int)sqrt(3))+2 == 3
Run Code Online (Sandbox Code Playgroud)
等等.