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

如何让这段C++完美数判断程序的循环在首次运行后正常工作?

问题分析与修复方案

核心问题

你的程序存在两个关键错误,导致无论输入什么数字都输出错误结果:

  1. 累加变量未重置:s在main函数开头初始化后,后续循环不会重新赋值。第一次运行后s的累加值会被保留,所有后续判断都会基于错误的数值。
  2. 因子求和逻辑冗余且易出错:你累加的是n/i,但当i是n的因子时,n/i同样是因子,这会导致重复计算(比如n=6时,i=2加3,i=3又加2),虽然部分完美数可能巧合得到正确结果,但逻辑不严谨且会在平方数场景下出错。

修复后的代码

#include <iostream>

using namespace std;

int main() {
  int n, i, x = 1;
  char z;

  while (x) {
    cout << "please enter a number for inspection : ";
    cin >> n;

    int s = 1; // 每次循环重置累加变量,确保判断基于当前数字的因子和
    // 优化循环范围:大于n/2的数不可能是n的真因子(除自身外)
    for (i = 2; i <= n / 2; i++) {
      if ((n % i) == 0)
        s += i; // 直接累加真因子i,避免重复计算
    }

    if (s == n && n > 1) { // 完美数定义要求大于1,排除无真因子的1
      cout << "the entered number is perfect\n";
    } else {
      cout << "number is not perfect\n";
    }

    cout << "do you wish to continue ?(y/n) : ";
    cin >> z;

    if (z != 'y')
      x = 0;
  }

  return 0;
}

修复说明

  • 重置累加变量:将s的初始化移到while循环内部,每次处理新数字时都从1开始累加真因子和。
  • 优化循环与求和逻辑:循环到n/2即可减少无效遍历,直接累加因子i避免重复计算,符合完美数的真因子求和定义。
  • 边界判断完善:添加n > 1的条件,因为1没有真因子,不符合完美数的数学定义。

内容的提问来源于stack exchange,提问作者pourya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:10:14