JavaScript 求1000以内的完数(完美数)

1、什么是完数(完美数)?

 

完数,一般指完全数,一个自然数如果它的所有真因子(即除了自身以外的约数)的和等于该数,那么这个数就是完全数,如:6的真因子有1 、2、3,6=1+2+3,所以6是一个完全数。

 

2、思路

 

1)首先由于完美数的定义,需要排除自身,所以数字 1一定不是完美数;


2)其次我们需要计算 num 除了它自身以外的所有正因子之和 sum,正因子必然是成对出现的,故而我们只需要遍历到 num 的平方根 sqrt 即可。

  • 以 36 为例,它的非自身外正因子有,1、2、3、4、6、9、12、18,其中 1 和 6 单独计算,[2, 18]、[3, 12]、[4, 9]都是对应关系、
  • 所以只需要遍历到 36 的平方根 6 就可以获取全部正因子。
  • 1 单独计算的原因是要排除自身,6 单独计算的原因是 6 * 6 = 36,两个值相同,故而只能计算一遍。

3)时间复杂度:O(\sqrt{n}),n 为 num 的大小

 

3、JavaScript实现代码

 

let arr=[];
			
function checkPerfectNumber(val){
	if(val == 1){
		return false;
	}
	
	let sum = 1;// 正整数一定会有一个1,同时不用考虑自身,所以单独处理
	
	let sqt=Math.sqrt(val);
	for(let i=2;i<sqt;i++){
		if(val % i === 0){
			sum +=i;
			sum +=val/i;//需要把当前因子对应的因子也加进来
		}
		// 此处单独处理的原因在于只需要加1次i值,如果在循环中会加2次
		if(i * i == val) {
		    sum += i;
		}
	}
	
	return sum ==val;

}
			
function findPerfectNumber(){
	for(let j=1;j<1000001;j++){
			if(checkPerfectNumber(j)){
				arr.push(j);
			}
		}
	console.info(arr)
}
			
findPerfectNumber();

 

本次运行后的输出的结果为:[6, 28, 496, 8128];

 

Tips:完美数只有 6, 28, 496, 8128, 33550336 这几个

 

 

参考资料:

作者:guanpengchn
链接:https://leetcode-cn.com/problems/perfect-number/solution/hua-jie-suan-fa-507-wan-mei-shu-by-guanpengchn/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值