poj 2739 Sum of Consecutive Prime Numbers 解题报告

题目链接: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 
 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 }

 

转载于:https://www.cnblogs.com/windysai/p/3231380.html

你可能感兴趣的:(poj 2739 Sum of Consecutive Prime Numbers 解题报告)