欧拉计划之题目10:计算两百万以下所有质数的和。
本题来自:http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/11-10
不晓得怎么,200W要运行5s,望谁能优化···
#include <stdio.h> const int num=2000000; int SunPrime(int n) { int sum=5,flag=0; for(int i=5;i<n;i=i+2) { for(int j=2;j*j<=i;j++) { if(i%j) { flag=1; } else { flag=0; break; } } if(flag)sum=sum+i; } return sum; } int main() { printf("%d\n",SunPrime(num)); return 0; }
筛法求素数
基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。如有:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是:
3 5 7 9 11 13 15 17 19 21 23 25 27 29
剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求出的素数为:
2 3 5 7 11 13 17 19 23 29
使用该思想,秒出答案:
# include <stdio.h> # include <string.h> long long isprime[2000010], primes[2000010], cnt; int main () { long long n = 2000000; long long i, j, sum = 0; memset (isprime, 1, sizeof(isprime)); for (i = 2; i <= 2000000; i++) { if (!isprime[i]) continue ; primes[cnt++] = i; sum += i; for (j = i*i ; j <= 2000000 && i <= 1500; j += i) { isprime[j] = 0; } } // sum = 0; // for (i = 0 ; i < cnt ; i++) // sum += primes[i]; printf ("%I64d\n", sum); return 0; }