编写程序输出2-20000间完全数,仅输出6,求问题排查
完全数程序问题分析与修复
代码里的关键错误
- for循环条件逻辑错误:你写的
for(int sum = 0; number % factorNum == 0; factorNum++),这个条件会让循环只在number能被factorNum整除时继续。但完全数需要检查所有小于自身的正整数是否为因数,而不是只遍历能整除的数。比如处理28时,factorNum到3就会因为28%3≠0直接终止循环,根本没机会处理4、7这些关键因数。 - sum初始化位置错误:sum在for循环内部初始化,每次循环迭代都会重置为0,导致因数累加完全失效。必须把sum的初始化移到for循环外面,确保每个待检查的number只初始化一次sum。
- 完全数判断时机错误:你每次加完一个因数就判断
number == sum,这只会在刚好累加后等于的情况(比如6)触发输出,其他完全数还没加完所有因数就被循环终止了。正确做法是等所有因数遍历完成后,再做判断。 - 语法疏漏:
++number后面少了分号;,这会导致编译报错,你能运行可能是输入代码时的疏忽。 - 参数类型错误:主方法参数应该是
String[] args,不是System[] args,这同样会导致编译问题。
修复后的基础版本代码
public static void partC(String[] args) { int number = 2; while(number <= 20000){ int sum = 0; int factorNum = 1; // 遍历所有小于当前number的正整数 for(; factorNum < number; factorNum++){ if(number % factorNum == 0){ sum += factorNum; } } // 遍历完所有因数后判断是否为完全数 if(number == sum){ System.out.println(number); } number++; } }
可选效率优化版本
如果想提升程序运行速度,可以把因数遍历的上限改成Math.sqrt(number),减少循环次数:
public static void partC(String[] args) { int number = 2; while(number <= 20000){ int sum = 1; // 1是所有大于1的数的因数,先提前累加 int factorNum = 2; int sqrt = (int)Math.sqrt(number); for(; factorNum <= sqrt; factorNum++){ if(number % factorNum == 0){ sum += factorNum; // 避免平方数的平方根被重复累加 if(factorNum != number / factorNum){ sum += number / factorNum; } } } if(number == sum){ System.out.println(number); } number++; } }
内容的提问来源于stack exchange,提问作者Noah Klug
相关产品推荐
相关产品推荐

