尺取

尺取-Sum of Consecutive Prime Numbers
问题:B
时间限制:1000毫秒
内存限制:65535 K.
描述
一些正整数可以由一个或多个连续素数的和表示。给定正整数有多少这样的表示?例如,整数53具有两个表示5 + 7 + 11 + 13 + 17和53.整数41具有三个表示2 + 3 + 5 + 7 + 11 + 13,11 + 13 + 17和41。 3只有一个表示,即3.整数20没有这样的表示。请注意,加数必须是连续的素数
数字,所以7 + 13和3 + 5 + 5 + 7都不是整数20的有效表示。
您的任务是编写一个程序,报告给定正整数的表示数。
输入
输入是一个正整数序列,每个都在一个单独的行中。整数介于2到10 000之间。输入的结尾用零表示。
产量
产量
输出应由每行对应于除最后一个零之外的输入行的行组成。输出行包括输入整数的表示的数量,作为一个或多个连续素数的总和。不应在输出中插入其他字符。
样本输入
2
3
17
41
20
666
12
53
0
样本输出
1
1
2
3
0
0
1
2

#include<bits/stdc++.h>

using namespace std;

long long su[10005],cnt;
int isprime[10005];
void prime()
{
cnt=1;
memset(isprime,1,sizeof(isprime));
isprime[0]=isprime[1]=0;
for (long long i=2;i<=10005;i++)
{
if (isprime[i])
su[cnt++]=i;
for (long long j=1;j<cnt&&su[j]*i<10005;j++)
{
isprime[su[j]*i]=0;
}
}
}
int main()
{
prime();

int n,sum,count1;
while(cin>>n&&n!=0)
{
    count1=0;
    int l=0,r=1;
    sum=0;
    for(;r<=10005;r++)
    {
        sum=sum+su[r];
        if(sum<n)
            continue;
        while(sum>n&&l<r)
        {
            sum=sum-su[l++];
        }
        if (sum==n)
        {
            count1++;
        }
    }
    cout<<count1<<endl;
}



return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值