版权声明:get busy living...or get busy dying https://blog.csdn.net/qq_41444888/article/details/89462249
https://vjudge.net/problem/POJ-2739
之前就做过一道尺取的题,完全没感觉,多找几道做一下
尺取法还是很重要的一个思想,一直用头尾两个指针进行维护更新
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#define ll long long
#define mod 1000000007
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 10005;//范围可以在这里调整
bool prime[maxn];
int isprime[maxn];
int main()
{
int cnt = 0;
memset(prime, 1, sizeof(prime));//初始化认为所有数都是素数
prime[0] = prime[1] = 0;//0和1特例标记出来,便于后续判断
for(int i = 2; i < maxn; i ++)
if(prime[i])//省去不必要的判断
{
isprime[++ cnt] = i;
for(int j = i + i; j <= maxn; j += i)//一个数的倍数不是素数,其中(int j = i * i)改为(int j = i + i)也一样
prime[j] = 0;
}
// for(int i = 1; i <= maxn; i ++)
// if(prime[i])
// isprime[++ cnt] = i;
int n;
while(scanf("%d", &n) != EOF && n)
{
int ans = 0;
int sum = 0;
int s = 1, t = 1;
for(; ; )
{
while(isprime[t] <= n && sum < n)
{
sum += isprime[t ++];
}
if(sum == n) ans ++;
sum -= isprime[s ++];
if(sum <= 0) break;
}
printf("%d\n", ans);
}
return 0;
}