You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写无全局变量的C++程序,列出给定上限内的所有polite数

C++ 实现输出指定范围内polite数的方案

核心概念说明

首先明确polite数的判定规则:可以表示为至少两个连续正整数之和的正整数,你给出的示例也符合这个定义:小于等于21的非polite数只有1、2、4、8、16,均为2的整数次幂。

实现思路(适合仅掌握for循环的阶段)

不需要用到复杂算法,用两层for循环即可完成判定:

  • 第一步:读取用户输入的上限值,做合法性校验(必须为正整数)
  • 第二步:遍历1到上限值的所有正整数,逐个判断是否为polite数
  • 第三步:单个数字的判定逻辑:
    1. 枚举连续序列的起始值i,范围是1到当前判定数n/2(连续两个数的和至少是i + (i+1) = 2i+1,所以i不可能超过n/2)
    2. 从i开始累加后续的正整数,直到累加和等于n(符合polite数要求)或者超过n(结束当前起始值的枚举)
    3. 只要找到任意一组符合要求的连续序列,即可判定为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:06:02