java求一万以内的完数_Java面试题(求1000以内的所有完数)

本文介绍了一种优化的完数查找算法。通过使用队列存储因子并仅在找到完数时打印,有效减少了重复计算和时间开销。这种方法适用于在一定范围内寻找完数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解:

官方解法:

public class wsTest {

public static void main(String[] args) {

for (int m = 2; m < 1000; m++) {

int s = 0;

for (int i = 1; i < m; i++) {

if ((m % i) == 0) {

s += i;

}

}

if (s == m) {

System.out.print(m + " its factors are:");

for (int j = 1; j < m; j++) {

if ((m % j) == 0) {

System.out.print(j);

System.out.print(" ");

}

}

System.out.println();

}

}

}

}

官方解法非常直接,先遍历1000以内的所有数,如果该数能够和它的所有因子的和相等,则该数是完数,然后重新从2开始遍历获取所有因子,再打印。

但是个人认为随着数的增大,对每一个数,获取因子的操作执行了2次,每次判断是否是因子都是使用mod运算,且每次for循环的时间复杂度都是O(N),开销过大。

因此这里以空间换时间,对每次的遍历都先使用一个队列来存储当前的所有因子,如果遍历完发现是完数,将队列中的所有元素逐个打印即可。

不论该数是否是完数,队列最后都应该清空,否则会影响下一次的结果。

优化后的代码如下:

importjava.util.LinkedList;importjava.util.Queue;

public classTest {

public static voidmain(String[] args) {

final intLOWER_LIMIT = 2;final intUPPER_LIMIT = 1000;Queue q = newLinkedList<>();for(inti = LOWER_LIMIT;i <= UPPER_LIMIT;i++) {

ints = 0;for(intj = 1;j < i;j++) {

if(i % j == 0) {

s += j;q.offer(j);}

}

if(s == i) {

System.out.printf("%d是完数",s);System.out.print(",包括因子:");for(Integer one : q) System.out.print(one + " ");System.out.println();}

q.clear();}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值