题目链接:http://poj.org/problem?id=2739
预处理出所有10001以内的素数,按照递增顺序存入数组prime[1...total]。然后依次处理每个测试数据。采用双重循环计算n的表示数:
外循环i : for (i = 0; x >= prime[i]; i++) 的循环结构枚举所有可能的最小素数prime[i];
内循环: while (ans < x && j < total) ans += prime[j++]; 计算连续素数的和ans,内循环结束时ans>=x。若ans = n,则连续素数的和的表示数为sum++,继续外循环。外循环结束后得出的sum即为问题的解。
1 #include <iostream> 2 using namespace std; 3 4 const int Maxn = 10000; // 设定素数表长 5 int total, prime[Maxn]; 6 7 int is_prime(int n) // 判断n是否为素数 8 { 9 int i; 10 for (i = 0; i < total; i++) 11 { 12 if (!(n % prime[i])) 13 return 0; 14 } 15 return 1; 16 } 17 18 int main() 19 { 20 int i, j, x, ans, sum; 21 total = 0; 22 for (i = 2; i <= Maxn; i++) // 预先建立素数表 23 { 24 if (is_prime(i)) 25 { 26 prime[total++] = i; 27 } 28 } 29 while (cin >> x && x) 30 { 31 sum = 0; // 和初始化为0 32 for (i = 0; x >= prime[i]; i++) // 枚举最小素数 33 { 34 j = i; 35 ans = 0;
36 while (ans < x && j < total) 37 { 38 ans += prime[j++]; // 求连续素数的和
39 } 40 if (ans == x) // 若和恰等于x,则累计答案数
41 sum++;
42 if (is_prime(x)) // 该数是素数时,和也要包括自己
43 sum++; 44 } 45 cout << sum << endl; 46 } 47 return 0; 48 }