Description
Input
Output
Sample Input
2 3 17 41 20 666 12 53 0
Sample Output
1 1 2 3 0 0 1 2
分析:1、对每个输入n,计算出小于n的素数,然后从连续的1个数、2个数、。。。、n/2个数,穷举,超时;
2、由于最大为10000,先建立素数表,然后从连续的1个数、2个数、。。。、n/2个数,穷举,超时;
3、建立素数表,然后穷举结束条件为和大于等于数n,AC。
方法一:超时
#include <iostream> #include <cmath> #include <cstring> using namespace std; int prime[1229]; int main() { int n, res; int i, j, length, end, start, flag; res=0; //memset(prime,0,sizeof(prime)); for(i=2; i<=10000; i++) { int sq=sqrt(i); flag=0; for(j=2; j<=sq; j++) { if(i%j==0) { flag=1; break; } } if(flag==0) { prime[res]=i; res++; } } while(cin>>n&&n!=0) { int k; for(k=0;k<1229;k++){ if(prime[k]>=n) break; } int sum=0, max=k; res=0; for(length=0; length<=k/2; length++) { start=0; end= max-length; for(start=0; start<=end; start++) { sum=0; for(i=start; i<=start+length; i++) { sum=sum+prime[i]; } if(sum==n) { res++; sum=0; break; } } } cout<<res<<endl; } return 0; }
方法二:AC
#include <iostream> #include <cmath> #include <cstring> using namespace std; int prime[1229]; int main() { int n, res; int i, j, k, flag, sum; res=0; //memset(prime,0,sizeof(prime)); for(i=2; i<=10000; i++) { int sq=sqrt(i); flag=0; for(j=2; j<=sq; j++) { if(i%j==0) { flag=1; break; } } if(flag==0) { prime[res]=i; res++; } } while(cin>>n&&n!=0) { k=0; for(i=0; i<res&&prime[i]<=n; i++) { sum = prime[i]; j=i+1; while(sum<n&&j<res) { sum=sum+prime[j++]; } if(sum==n) { k++; } //cout<<" i="<<i<<endl; } cout<<k<<endl; } return 0; }