题目
据说冰牙白虎在反抗暗黑达的时候由于用力过猛,导致法力尽失。但想到当小渡找到他的时候,他居然变成了一个连数都数不清的傻喵。白虎虽然变成了喵,但是他却依然要给小渡设立考验。
由于白虎大人数不清数了,他想要算数学题就十分困难,现在他只知道一些整数可以用一个或多个连续的素数和表示。现在他给出你一个正整数n,你要算出这个整数可以有多少种这样的表示方法。
比如:53 有两种表示方法 5 + 7 + 11 + 13 + 17 和 53
Input
多组数据输入,每行一个数字n,n在2和10000之间,输入0结束
Output
每个输出占一行,输出对应的答案
Sample Input
2
3
17
41
20
666
12
53
0
Sample Output
1
1
2
3
0
0
1
2
先筛素数,然后尺取
#include <stdio.h>
int main()
{
int i,j,vis[10010]={1,1,0},pri[10000],c=0;
for(i=2;i<10010;i++) //先筛素数
{
if(vis[i]==0)
{
pri[c++]=i; //开一个数组来保存素数,方便下面进行连续素数的加减运算
for(j=i+i;j<10010;j+=i)
vis[j]=1;
}
}
int sum=0;
int n,d;
while(scanf("%d",&n)!=EOF&&n!=0)
{
d=0,sum=0;
for(int l=0,r=0;r<c&&pri[r]<n;) //尺取
{
if(sum==n)
{
d++;
sum-=pri[l++];
}
while(sum<n) sum+=pri[r++]; //素数和比n小,继续加,右边界右移
while(sum>n) sum-=pri[l++]; //素数和比n大,减去最左端数字,左边界右移
}
if(vis[n]==0) d++; //如果n本身是素数,表示方法加1
printf("%d\n",d);
}
}