如何编写无全局变量的C++程序,列出给定上限内的所有polite数
C++ 实现输出指定范围内polite数的方案
核心概念说明
首先明确polite数的判定规则:可以表示为至少两个连续正整数之和的正整数,你给出的示例也符合这个定义:小于等于21的非polite数只有1、2、4、8、16,均为2的整数次幂。
实现思路(适合仅掌握for循环的阶段)
不需要用到复杂算法,用两层for循环即可完成判定:
- 第一步:读取用户输入的上限值,做合法性校验(必须为正整数)
- 第二步:遍历1到上限值的所有正整数,逐个判断是否为polite数
- 第三步:单个数字的判定逻辑:
- 枚举连续序列的起始值i,范围是1到当前判定数n/2(连续两个数的和至少是i + (i+1) = 2i+1,所以i不可能超过n/2)
- 从i开始累加后续的正整数,直到累加和等于n(符合polite数要求)或者超过n(结束当前起始值的枚举)
- 只要找到任意一组符合要求的连续序列,即可判定为polite数
可运行代码示例
#include <iostream> using namespace std; int main() { int upperLimit; cout << "请输入上限值:"; cin >> upperLimit; // 遍历所有要检查的数,从3开始因为1、2肯定不是polite数 for (int n = 3; n <= upperLimit; n++) { bool isPolite = false; // 枚举连续序列的起始值 for (int start = 1; start <= n / 2; start++) { int sum = 0; // 从start开始累加 for (int current = start; current < n; current++) { sum += current; if (sum == n) { isPolite = true; break; } if (sum > n) { break; } } if (isPolite) { break; } } if (isPolite) { cout << n << " "; } } cout << endl; return 0; }
说明:代码完全没有使用全局变量,所有变量均为函数内的局部变量,符合作业要求。三层for循环逻辑清晰,适合刚学习循环的阶段理解。
优化思路(可选,基于数学性质)
已经被证明的结论:正整数是polite数当且仅当它不是2的整数次幂,所以可以用更高效的方式判定,不需要多层循环:
判定2的幂的方法:如果n & (n-1) == 0,则n是2的整数次幂,反之则为polite数,对应判定代码可以替换为:
bool isPolite = (n & (n - 1)) != 0;
内容的提问来源于stack exchange,提问作者user17004681
相关产品推荐
相关产品推荐

