[Project Euler] Problem 10
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million.
求所以小于2,000,000的素数之和
对于素数,我还是利用第七问中的查表法
我们需要保留在表中的素数是所有小于sqrt(2000000)的素数
也就是小于1415的素数,由于除2外的所以素数都是奇数
且数越大,素数的密度越小
我估计小于1415的素数不大于300个。最后验证为223个
但我们为了确保能装下所有小于1415的素数,我们申请了一个750个长度的数组
当然,这在后来看来是严重浪费的
#include <iostream>
usingnamespace std;
constint END =1000;
bool isPrime(int init,int table[],int num){
for(int i=0; i<num; i++){
if(table[i]*table[i] > init)
break;
if(init%table[i] ==0)
returnfalse;
}
returntrue;
}
int main(){
longlong sum =2;
int num =1;
int primeTable[END] = {2};
int init =3;
while (init <2000000){
if(isPrime(init,primeTable,num)){
sum += init;
if(init <1415){
primeTable[num] = init;
num++;
}
}
init +=2;
}
cout << sum <<endl;
return0;
}
usingnamespace std;
constint END =1000;
bool isPrime(int init,int table[],int num){
for(int i=0; i<num; i++){
if(table[i]*table[i] > init)
break;
if(init%table[i] ==0)
returnfalse;
}
returntrue;
}
int main(){
longlong sum =2;
int num =1;
int primeTable[END] = {2};
int init =3;
while (init <2000000){
if(isPrime(init,primeTable,num)){
sum += init;
if(init <1415){
primeTable[num] = init;
num++;
}
}
init +=2;
}
cout << sum <<endl;
return0;
}
最后要说明的是,结果超出了 int 和 long 的范围(实际上,32位计算机上 int 和 long 是一样的),我们声明为long long型