【Java】Java初级算法基础 ,"完数"问题
/**
* 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。 例如6=1+2+3.编程 找出1000以内的所有完数。
*
*/
public class Code7 {
public static void main(String[] args) {
wanShu(1000);
}
private static void wanShu(int num) {
for (int i = 2; i <= num; i++) {
//i++一次 sum清零一次
int sum = 0;
//值判断i有几个因数
for (int j = 1; j < i; j++) {
//模除为0则是其因数
if (i % j == 0) {
sum += j;
}
}
//累加和相等则为完数
if (sum == i) {
System.out.println(sum);
}
}
} 正在学习Javav,来看看这个学习机会 我也在学JAVA 这么多在学JAVA的啊 算法可以优化一下:一个数的因子总是成对出现的,而且这对因数总是有一个大于等于这个数的1/2,另一个小于等于它的1/2,在每次for循环中是一定能得到这两个数(一个是能够被整除的数,另一个是被整除的商)。对于一个大于2的数就可以将循环终止条件缩小一半,即减少一半的循环次数,但是要做好特殊值的处理(除数是1,或者这个数是偶数,除数是他的一半) /**
* 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。 例如6=1+2+3.编程 找出1000以内的所有完数。
*
*/
public class Code7 {
public static void main(String[] args) {
wanShu(1000);
}
private static void wanShu(int num) {
for (int i = 2; i <= num; i++) {
//i++一次 sum清零一次
int sum = 0; //这个为什么用Sum呢?局部变量放在这里,代码变得很难读懂。。。。
//值判断i有几个因数
for (int j = 1; j < i; j++) {
//模除为0则是其因数
if (i % j == 0) {
sum += j;
}
}
//累加和相等则为完数
if (sum == i) {
System.out.println(sum);
}
}
} svxcfg 发表于 2020-11-12 07:44
/**
* 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。 例如6=1+2+3.编程 找出1000以内的所有 ...
6的sum因子是1 2 3
前面已经加过sum了 你再加就是从6开始了,所以要初始化为0 可以考虑优化一下O(n2)的复杂度 j<(i/2)就可以了吧 本帖最后由 WooYun 于 2020-11-15 23:26 编辑
zhangwei1997 发表于 2020-11-12 10:25
j我试了,确实少了一半时间
页:
[1]
2