题目:点击打开链接
题意:输入n(2<=n<=10000),有多少种方案可以把n写成若干个连续素数之和?例如,41可以有2+3+5+7+11,11+13+17,41三种方案。
先筛选素数表,然后暴力枚举。。。
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
vector<int> primes;
int vis[maxn];
void init()
{
int m=sqrt(maxn+0.5);
for(int i=2;i<=m;i++)
if(!vis[i])
for(int j=i*i;j<=maxn;j+=i)
vis[j]=1;
for(int i=2;i<=maxn;i++)
if(!vis[i]) primes.push_back(i);
}
int main()
{
init();
int n;
while(cin>>n,n)
{
int ans=0;
int sum=0;
for(int i=0;i<primes.size();i++)
{
if(primes[i]>n) break;
sum=0;
for(int j=i;j<primes.size();j++)
{
sum+=primes[j];
if(sum>n) break;
if(sum==n){++ans;break;}
}
}
cout<<ans<<endl;
}
return 0;
}