Sum of Consecutive Prime Numbers
题意:
给出一个数n,它可以表示为连续的素数相加之和,问一共有多少种表示方法?
分析:
枚举每个素数为左端点,根据区间和确定其右端点,如果区间和大于n,左端点右移,如果等于n,则方法数+1。
代码:

#include <map> #include <math.h> #include <string> #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; #define ll long long #define ull unsigned long long #define cls(x) memset(x,0,sizeof(x)) #define clslow(x) memset(x,-1,sizeof(x)) const int maxn=1e4+100; int n,cnt; bool vis[maxn]; int prime[maxn],sum[maxn]; void init() { cnt=0; cls(vis); vis[1]=true; for(int i=2;i<maxn;i++){ for(int j=i*i;j<maxn&&!vis[i];j+=i){ vis[j]=true; } } for(int i=1;i<maxn;i++){ if(!vis[i]) prime[++cnt]=i; } sum[0]=0; for(int i=1;i<=cnt;i++){ if(i==1) sum[i]=prime[i]; else sum[i]=sum[i-1]+prime[i]; } } int main() { // freopen("in.txt","r",stdin); init(); while(scanf("%d",&n)!=EOF&&n) { int s=0,e=1,ans=0; while(e<cnt) { int val=sum[e]-sum[s]; if(val==n) ans++; if(val>n) s++; else e++; if(s==e) e++; } printf("%d ",ans); } return 0; }