Sum of Consecutive Primes

解题关键在于用筛选法求得素数(详细可百度)

所谓“筛选法”指的是“埃拉托色尼(Eratosthenes)筛法”。他是古希腊的著名数学家。他采取的方法是,在一张纸上写上1到100全部整数,然后逐个判断它们是否是素数,找出一个非素数,就把它挖掉,最后剩下的就是素数。

具体做法如下:
<1> 先将1挖掉(因为1不是素数)。
<2> 用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。
<3> 用3去除它后面的各数,把3的倍数挖掉。
<4> 分别用4、5…各数作为除数去除这些数以后的各数。这个过程一直进行到在除数后面的数已全被挖掉为止。例如找1~50的素数,要一直进行到除数为47为止(事实上,可以简化,如果需要找1~n范围内素数表,只需进行到除数为n^2(根号n),取其整数即可。例如对1~50,只需进行到将50^2作为除数即可。)

 

然后从第一个素数开始枚举累加(放心,这道题这样不会超时)

看完“狼代码”博客后才知道这样的思路,代码有参考它的写法。

 1 #include<iostream>
 2 #include<memory.h>
 3 using namespace std;
 4 const int MAXN = 10005;
 5 bool isPrime[MAXN];
 6 int prime[MAXN],pnum;
 7 
 8 void getPrime()
 9 {
10     // 筛选法求素数 
11     memset(isPrime,true,sizeof(isPrime));
12     for(int i = 2; i <= MAXN; i ++)
13         if(isPrime[i])
14             for(int j = i; j*i <= MAXN; j ++)
15                 isPrime[i*j] = false;
16     
17     // 获取素数数组 
18     pnum = 1;
19     for(int i = 2; i <= MAXN; i ++)
20         if(isPrime[i])
21             prime[pnum ++] = i;
22 }
23 
24 
25 int main()
26 {
27 getPrime();
28 int n;
29 while(cin>>n&&n!=0)
30 {
31 int all=0;
32 for(int i=1;prime[i]<=n;i++)
33 {
34 int sum=0;
35 int x=i;
36 while(sum<=n)
37 {
38 sum+=prime[x++];
39 if(sum==n) all++;
40 }
41  
42 }
43 cout<<all<<endl;
44 } 
45 //system("pause");
46 } 

 

posted @ 2012-09-19 09:01  晨风世界  阅读(275)  评论(0编辑  收藏  举报