为何求完全数的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
相关产品推荐
相关产品推荐

