尺取法
图片来自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;
}