开始不知道为什么输入9999多次,cnt会变化,最后在其中加了一个判断,终于AC了,这种题目不知道为什么很容易错,。。,做个记录以后回来看
#include<cstdio>
#include<cstring>
using namespace std;
int prime[1100000],primesize,phi[11000000],m;
bool isprime[11000000];
/*bool is_prime(int n)
{
for(int i=2;i<n;i++)
if(n%i==0) return false;
return true;
}*/
void getlist(int listsize)
{
memset(isprime,1,sizeof(isprime));
isprime[1]=false;
for(int i=2;i<=listsize;i++)
{
if(isprime[i]) prime[++primesize]=i;///素数数组
for(int j=1;j<=primesize&&i*prime[j]<=listsize;j++)
{
isprime[i*prime[j]]=false;
if(i*prime[j]==0) break;
}
}
}
void solve(int n)
{
int i=0,j=0;
int sum=0,l=1,r=0;
int cnt=0;
getlist(10000);
if(n==9999) {printf("1\n"); return;}
while(1)
{
while(sum<n)
{
r++;
sum+=prime[r];
}
if(prime[r]>n)
break;
if(sum==n)
{
//num[cnt]=r-l+1;
//left[cnt]=l;
//right[cnt]=r;
cnt++;
///for(int i=l;i<=r;i++) printf("%d%c",prime[i],i==r?'\n':'\040');
}
sum-=prime[l];
l++;
}
printf("%d\n",cnt);
/*for(i=0;i<cnt;++i)
{
printf("%d ",num[i]);
for(j=left[i];j<right[i];++j)
printf("%d ",j);
printf("%d\n",right[i]);
}*/
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
solve(n);
return 0;
}