尺取法 || POJ 2739 Sum of Consecutive Prime Numbers

给一个数 写成连续质数的和的形式,能写出多少种
*解法:先筛质数 然后尺取法
**尺取法:固定区间左、右端点为0,如果区间和比目标值大则右移左端点,比目标值小则右移右端点
#include <iostream>
#include <cstdio>
using namespace std;
#define SZ 11000
bool isprime[SZ];
int prime[SZ], num[SZ];
int cnt;
void prim(int n)
{
    memset(isprime, 1, sizeof(isprime));//1->是素数,0->不是素数
    memset(prime, 0, sizeof(prime));
    isprime[0] = 0;
    isprime[1] = 0;
    cnt = 1;
    for(int i = 2; i <= n; i++)
    {
        if(isprime[i]) prime[cnt++] = i;
        for(int j = 1; j <= cnt && i * prime[j] <= n; j++)
        {
            isprime[i * prime[j]] = 0;
            if(i % prime[j] == 0) break;
        }
    }
    return;
}
int main()
{
    while(1)
    {
        int n;
        scanf("%d", &n);
        if(n == 0) break;
        prim(n);
        num[0] = 0;
        for(int i = 1; i < cnt; i++)
            num[i] = num[i - 1] + prime[i];
        int l = 1, r = 1, ans = 0;
        while(r < cnt)
        {
            if(num[r] - num[l - 1] < n) r++;
            else if(num[r] - num[l - 1] > n) l++;
            else if(num[r] - num[l - 1] == n) ans++, l++, r++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

 

posted @ 2018-02-03 18:36  舒羽倾  阅读(137)  评论(0编辑  收藏  举报