WooYun 发表于 2020-11-11 23:14

【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);
                        }

                }
      }

goblin0427 发表于 2020-11-12 00:12

正在学习Javav,来看看这个学习机会

圈圈呼啦 发表于 2020-11-12 01:01

我也在学JAVA

bigdawn 发表于 2020-11-12 01:16

这么多在学JAVA的啊

再见babay 发表于 2020-11-12 01:16

算法可以优化一下:一个数的因子总是成对出现的,而且这对因数总是有一个大于等于这个数的1/2,另一个小于等于它的1/2,在每次for循环中是一定能得到这两个数(一个是能够被整除的数,另一个是被整除的商)。对于一个大于2的数就可以将循环终止条件缩小一半,即减少一半的循环次数,但是要做好特殊值的处理(除数是1,或者这个数是偶数,除数是他的一半)

svxcfg 发表于 2020-11-12 07:44

/**
* 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。 例如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);
                        }

                }
      }

QingYi. 发表于 2020-11-12 08:31

svxcfg 发表于 2020-11-12 07:44
/**
* 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。 例如6=1+2+3.编程 找出1000以内的所有 ...

6的sum因子是1 2 3
前面已经加过sum了 你再加就是从6开始了,所以要初始化为0

QingYi. 发表于 2020-11-12 08:33

可以考虑优化一下O(n2)的复杂度

zhangwei1997 发表于 2020-11-12 10:25

j<(i/2)就可以了吧

WooYun 发表于 2020-11-15 22:11

本帖最后由 WooYun 于 2020-11-15 23:26 编辑

zhangwei1997 发表于 2020-11-12 10:25
j我试了,确实少了一半时间

页: [1] 2
查看完整版本: 【Java】Java初级算法基础 ,"完数"问题