尺取法

图片来自http://blog.chinaunix.net/uid-24922718-id-4848418.html

连续数字的和不大于n

用一道题目来说明

http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3352

题意:

给定一个数字N
求一组连续素数的和等于N;
问一共有几组这样的素数

include<stdio.h>

include

include<string.h>

using namespace std;
const int N=10005;
int prim[N];
int biao[N];
void primBiao()//筛选法求素数
{
prim[2]=true;
for(int i=3; i<N; i++)
if(i%2)prim[i]=true;
else prim[i]=false;
for(int i=3; i*i<=N; i+=2)
for(int j=i+i; j<N; j+=i)
if(prim[j])prim[j]=false;
int k=0;
for(int i=2; i<10005; i++)
if(prim[i])
biao[k++]=i;// 打印素数表
}
int main()
{
primBiao();
int n;
while(scanf("%d",&n),n)
{
int sum=0,right=-1,left=-1,count=0;
while(1)
{
while(sum<n)
sum+=biao[++right];//右端点向右走 直到不满足条件
if(biao[right]>n)break;
if(sum==n)//满足条件时组数加一
count++;
sum-=biao[++left];//不满足条件时 左短点向右走一步
}
printf("%d\n",count);
}
return 0;
}

posted @ 2016-03-26 14:14  -梦里不知身是客  阅读(173)  评论(0编辑  收藏  举报