#include<iostream>
#include<math.h>
#include<string>
using namespace std ;
const int MAX=10000;
bool flag[MAX+1];
int a[MAX+1];
int size=0;
void prime(int max)
{
memset(flag,true,sizeof(flag));
int t=sqrt((double)max)+1;
int i,j,k;
for(i=2;i<=t;i++)
{
if(flag[i])
for(j=2,k=max/i+1;j<k;j++)
flag[i*j]=false;
}
for(i=2;i<=max;i++)
{
if(flag[i])
{
a[size++]=i;
}
}
}
int main()
{
int i,j,n,sum,num,s;
prime(MAX);
for (;;)
{
cin>>n;
num=0;
for (i=0;i<MAX+1;i++)
{
if (n>=a[i] && n<=a[i+1]) {s=i+1;}
}
if (n==0) return 0;
else
{
for(i=0;i<s;i++)
{
sum=0;
if(a[i]>n) break;
for(j=i;j<MAX+1;j++)
{
sum+=a[j];
if(sum==n)
{
num++;
break;
}
if (sum>n)
break;
}
}
cout<<num<<endl;
}
}
return 0;
#include<math.h>
#include<string>
using namespace std ;
const int MAX=10000;
bool flag[MAX+1];
int a[MAX+1];
int size=0;
void prime(int max)
{
memset(flag,true,sizeof(flag));
int t=sqrt((double)max)+1;
int i,j,k;
for(i=2;i<=t;i++)
{
if(flag[i])
for(j=2,k=max/i+1;j<k;j++)
flag[i*j]=false;
}
for(i=2;i<=max;i++)
{
if(flag[i])
{
a[size++]=i;
}
}
}
int main()
{
int i,j,n,sum,num,s;
prime(MAX);
for (;;)
{
cin>>n;
num=0;
for (i=0;i<MAX+1;i++)
{
if (n>=a[i] && n<=a[i+1]) {s=i+1;}
}
if (n==0) return 0;
else
{
for(i=0;i<s;i++)
{
sum=0;
if(a[i]>n) break;
for(j=i;j<MAX+1;j++)
{
sum+=a[j];
if(sum==n)
{
num++;
break;
}
if (sum>n)
break;
}
}
cout<<num<<endl;
}
}
return 0;
}
这题是我重做的,一开始那种打表枚举的方法实在是太渣,这是素数筛法的做法,素数筛法大概意思就是,一大串数字中,先把第一个素数的倍数所有的倍数都去掉,然后把接下来第一个素数的倍数全部删掉,如此以往,最后剩下的所有的数都是素数了。