给一个数 写成连续质数的和的形式,能写出多少种
*解法:先筛质数 然后尺取法
**尺取法:固定区间左、右端点为0,如果区间和比目标值大则右移左端点,比目标值小则右移右端点
#include <iostream> #include <cstdio> using namespace std; #define SZ 11000 bool isprime[SZ]; int prime[SZ], num[SZ]; int cnt; void prim(int n) { memset(isprime, 1, sizeof(isprime));//1->是素数,0->不是素数 memset(prime, 0, sizeof(prime)); isprime[0] = 0; isprime[1] = 0; cnt = 1; for(int i = 2; i <= n; i++) { if(isprime[i]) prime[cnt++] = i; for(int j = 1; j <= cnt && i * prime[j] <= n; j++) { isprime[i * prime[j]] = 0; if(i % prime[j] == 0) break; } } return; } int main() { while(1) { int n; scanf("%d", &n); if(n == 0) break; prim(n); num[0] = 0; for(int i = 1; i < cnt; i++) num[i] = num[i - 1] + prime[i]; int l = 1, r = 1, ans = 0; while(r < cnt) { if(num[r] - num[l - 1] < n) r++; else if(num[r] - num[l - 1] > n) l++; else if(num[r] - num[l - 1] == n) ans++, l++, r++; } printf("%d\n", ans); } return 0; }