java小程序求解答(完数),为什么第二层循环的j一定要小于i/2,不能是i呢?

public class WangShu {

/**
* @param args
*/
public static void main(String[] args) {

for (int i = 1; i < 1000; i++) {
int sum = 0;
for (int j = 1; j <= i/2; j++) {//这里的j不能是小于i吗?为什么一定要是小于i/2呢
if (i % j == 0) {
sum = sum + j;
}
}
if (sum == i){
System.out.print(i + "\t");
}
}

}
}

第1个回答  2014-05-03
最简单的,你代几个数字进去就知道了。你这程序的目的是
求约束的和,一个数的约束除了自己,就没有大于它自己一半的了。所以就没有必要循环i/2之后的了,减少了程序的运行时间。
第2个回答  2014-05-03
不是不行,而是没有必要,因为结果是一样的。

这一步要找的是真因子,n以内的数有已(n/2 + 1)为真因子的数吗?没有,它最小是n+2超过n了。

所以i/2以后的循环不用走了。
第3个回答  2014-05-03
可以是i,但是你再看一下你的条件,如果j>i/2,那么i%j==0就一定是false,及后边的i/2次循环式无用的,所以用j<=i/2。
相似回答