完数的求解-优化约数的求解

完数的求解

完数定义

一个数的约数和(含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。本人小霸王电脑还没有求解出来第五个完数,不知道有没有更优秀的求解思路,欢迎大佬指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值