POJ - 2739

题目
据说冰牙白虎在反抗暗黑达的时候由于用力过猛,导致法力尽失。但想到当小渡找到他的时候,他居然变成了一个连数都数不清的傻喵。白虎虽然变成了喵,但是他却依然要给小渡设立考验。
由于白虎大人数不清数了,他想要算数学题就十分困难,现在他只知道一些整数可以用一个或多个连续的素数和表示。现在他给出你一个正整数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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值