poj 2739 Sum of Consecutive Prime Numbers 解题报告

本文介绍了解决POJ 2739问题的方法,通过预处理出10001以内的素数并存储,使用双重循环计算特定整数作为连续素数之和的不同表示次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值