题目
求1000以内完数
- 完数定义:
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数)恰好等于它本身 - 例如:
1+2+4+7+14=28
以下
public class PerfectNumber {
public static void main(String[] args) {
int s =0;
for(int i=2;i<1000;i++) {
for(int j=1; j<i; j++) { // 寻找真因子,不包括自身
if(i%j==0) { //i是否可以被j整除,是则j为其约数
s=s+j;
}
}
if(s==i) System.out.println(s);
s=0; //每次将s置0
}
}
}
再改进一下:
根据之前”求素数“学到的规律,在求一个数的因数时,只需要循环[i,sqrt(i)]即可,那么上面的方法for(int j=1; j<i; j++)
可以改成for(int j=1; j*j<i; j++)
。当i%j==0时s记录j和i/j的值。 (5.18更新~
以下:
public class PerfectNumber {
public static void main(String[] args) {
int s =0;
for(int i=2;i<1000;i++) {
for(int j=1; j*j<=i; j++) {
if(i%j==0) {
if(j==1) {
s=s+j; //当j为1时,即第一个因数为1时,不计入i/j
}else {
s=s+j+i/j;
}
}
}
if(s==i) System.out.println(s);
s=0; // s重新开始计算
}
}
}
结果:
几次想出来的方法总是没离开求质因数,然而这个方向是错误的,此题其实没那么复杂…… 求完数找的是真因子。