求素数前缀和,把输入的数字n当成连续的素数之和,必定会有sum1-sum2 = n,也就是说sum1和sum2都存在于前缀和数组中,统计sum1或者sum2的个数
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> primes;
const int MAXM = 1799800;
bool is_prime[MAXM];
int main() {
// 初始化
for(int i = 0; i < MAXM; ++i) {
is_prime[i] = true;
}
// 打表
is_prime[0] = is_prime[1] = false;
for(int i = 2; i <= MAXM; ++i) {
if(is_prime[i]) {
primes.push_back(i);
for(int j = 2 * i; j <= MAXM; j += i) {
is_prime[j] = false;
}
}
}
int m;
while(scanf("%d", &m) == 1 && m) {
if(is_prime[m]) {
printf("0\n");
} else {
vector<int>::iterator pos = lower_bound(primes.begin(), primes.end(),m);
// printf("%d**", pos);
// printf("%d -- %d", *pos, 0);
printf("%d\n",*pos-*(pos-1));
}
}
return 0;
}