完数的求解
完数定义
一个数的约数和(含1,但不包含本身)等于该数本身, 称这个数为完数。
求 10,0000以内的完数程序:参考了求质数时利用开方,缩小求解范围的思想,和约数本身的性质,两个约数的乘积进行拆解,知道较小的约数后可以反求较大的约数。
/**
* 1000以内的完数
* 完数:
* 一个数的约数和(含1不包含本身)等于本身 称 这个数为完数
* <p>
* 33550336 为第五个完数
*
* @author yanjq
*/
public class PerfectNumTest {
public static void main(String[] args) {
//求约数和,可以利用质数的思想,从开平方的范围内缩小,来找,来验证
int divisorSum;
long start = System.currentTimeMillis();
for (int i = 2; i <= 100000; i++) {
divisorSum = 1;//约数和
for (int j = 2; j <= Math.sqrt(i); j++) {//利用求质数的思想,开方缩小范围,虽然第五个完数较大
if (i % j == 0) {
divisorSum += j;//约数累加
divisorSum += (i / j);//利用大小约数的性质,加上另外一个约数
}
}
if (divisorSum == i) {
System.out.println(i);
}
}
long end = System.currentTimeMillis();
System.out.println("程序耗时:" + (end - start));
}
}
相较于参考过的网上的一些写法,求解约数的过程都比较耗时。本段代码参考质数的求解思想做了下改进。虽然第五个完数是:33550336。本人小霸王电脑还没有求解出来第五个完数,不知道有没有更优秀的求解思路,欢迎大佬指点。