完数,即完美自然数,若一个数等于其所有因子之和,则这个数就被称为完数。(因子:除去这个数本身的所有其他约数;例如6 = 1 + 2 + 3,故6为完数。)
前言
本博文主要介绍搜寻1000以内所有完数的优化程序,重点是博主在学习过程中编写程序犯的错误。
一、常用程序
class PerfectNum {
public static void main(String[] args) {
System.out.println("完数是:");
for(int i = 1;i <= 1000;i++){
int num = 0;
for(int j = 1;j <= i / 2;j++){
if(i % j == 0){
num += j;
}
}
if(num == i){
System.out.println(i);
}
}
}
}
运行结果:
二、优化程序
1.正确程序
class PerfectNum {
public static void main(String[] args) {
System.out.println("完数是:");
for(int i = 1;i <= 1000;i++){
int num = 1;
for(int j = 2;j <= Math.sqrt(i);j++){
//注意这里的j是从2开始的
if(i % j == 0){
num += (j + i / j);
}
}
if(i != 1 && num == i){
System.out.println(i);
}
}
}
}
2.错误程序
class PerfectNum {
public static void main(String[] args) {
System.out.println("完数是:");
for(int i = 1;i <= 1000;i++){
int num = 0;
for(int j = 2;j <= Math.sqrt(i);j++){
if(i % j == 0){
num += (1 + j + i / j);//错误原因:每个子循环都会额外加1
//既然每个完数必有因子1,就将变量num初始值设为1
}
}
if(i != 1 && num == i){
System.out.println(i);
}
}
}
}
错误程序运行结果:
总结
对于循环、变量的理解还应当加深。