POJ 2739 Sum of Consecutive Prime Numbers (尺取法)

版权声明: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;
}

猜你喜欢

转载自blog.csdn.net/qq_41444888/article/details/89462249