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

为何求完全数的C++程序仅输出1?修改循环后正确却不解原理

完全数程序问题分析

先看你写的原代码:

int n;
int sum;
    
cout << "write a number";
cin >> n;

for (int i = 1; i < n; i++)
{
    sum = 0;
    for (int j = 1; j <= i; j++)
    {
        if (i % j == 0)
            sum = sum + j;
    }
    if (sum == i)
        cout << i<< endl;
}

为什么原程序只输出1?

完全数的定义是:一个数等于它所有除自身以外的正约数之和。但你的第二个循环把j遍历到了i本身,这就导致sum会把i自己也加进去。比如:

  • 对于i=6,它的约数是1、2、3、6,sum=1+2+3+6=12,显然12≠6,不会被输出;
  • 只有i=1的时候,它的约数只有1,sum=1,刚好等于i,所以只会输出1。

为什么改成j <= i/2就正确?

一个正整数i(i>1)的所有非自身约数里,最大的那个不会超过i/2。比如:

  • 6的非自身最大约数是3,正好是6/2;
  • 28的非自身最大约数是14,正好是28/2;
  • 哪怕是质数比如7,它的非自身约数只有1,也远小于7/2=3.5。

所以遍历到i/2就足够收集到所有除自身外的正约数,此时计算的sum就是这些约数的总和,当sum == i时,就符合完全数的定义了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:15:50