解题关键在于用筛选法求得素数(详细可百度)
所谓“筛选法”指的是“埃拉托色尼(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 }