首先使用打表法将范围内的所有的素数都求出来,然后利用互动窗口来求解即可,具体实现见如下代码:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
#include<functional>
using namespace std;
const int maxn = 10010;
vector<int> prime;
bool vis[maxn];
void Init(){
memset(vis, 0, sizeof(vis));
vis[0] = vis[1] = 1;
int up = floor(sqrt(maxn) + 0.5);
for (int i = 2; i <= up; i++){
if (!vis[i]){
for (int j = i*i; j <= 10000; j += i)
vis[j] = 1;
}
}
for (int i = 2; i <= 10000; i++)
if (!vis[i]) prime.push_back(i);
}
int main(){
Init();
int N;
while (cin >> N){
if (N == 0) break;
int l, r;
l = r = 0;
int sum = prime[0];
int ans = 0;
while (l<=r&&r<prime.size()&&prime[r]<=N){
if (sum == N){
ans++;
sum -= prime[l];
l++;
}
else if (sum < N){
r++;
sum += prime[r];
}
else{
sum -= prime[l];
l++;
}
}
cout << ans << endl;
}
return 0;
}