很简单的一道题。
因为是连续的, 所以直接按顺序把每个素数加起来, 如果和大于或等于要求的数, 那就删掉第一个。
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int maxv = 10240;
int is_primes[maxv] = {1, 1};
vector<int> primes;
void Eratosthenes() {
for(int i = 2; i <= maxv; i++)
if(!is_primes[i]) {
for(int j = 2; j * i <= maxv; j++)
is_primes[j * i] = 1;
primes.push_back(i);
}
}
int main() {
Eratosthenes();
int const len = primes.size();
int n;
while(scanf("%d", &n)&& n) {
queue<int> s;
int sum = 0, res = 0;
for(int i = 0; i < len; i++) {
s.push(primes[i]);
sum += primes[i];
while(sum > n) {
sum -= s.front();
s.pop();
}
if(sum == n) {res++; sum -= s.front(); s.pop();}
if(primes[i] > n) break;
}
printf("%d\n", res);
}
return 0;
}