程序员

Java遍历完数的一些思考

2016-12-13  本文已影响250人  lkee6760

题目:打印出1~10000以内所有的完数

1.分析1

2.代码:

public class PerfectNumberDemo {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for (int num = 2; num <= 10000 ; num ++ ) {
            int sum = 0;
            for (int divisor = 1 ; divisor < num ; divisor ++) {
                if (num % divisor == 0 ) {
                    sum = divisor + sum;
                }
            }
            if (sum == num) {
                System.out.println(num);
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历全部完数所使用的时间: " + (end - start) + " 毫秒");
    }
}

3.一点思考

4.代码优化

public class PerfectNumberTest {
    public static void main(String[] args) {
        int count = 0;//定义一个计数器
        System.out.println("1~10000范围内的所有完数如下:");
        long start = System.currentTimeMillis();
        for (int num = 2; num <= 10000 ; num ++ ) {
            int sum = 0;//定义一个因子求和公式
            for (int divisor = 1 ; divisor <= num / divisor ; divisor ++) {
                if (num % divisor == 0 && divisor != num / divisor) {//若num开根号结果不是他的因子
                    sum = divisor + (num / divisor) + sum;//则num/divisor也一定是他的因子
                } else if (num % divisor == 0 && divisor == num / divisor) {//若num开根号的结果是他的因子
                    sum = divisor + sum;//则只把因子(num/divisor重复因子)赋值给sum
                }
            }
            if ((sum - num) == num) {//如果因子之和-该数等于该数,则这个数就是完数
                count ++;//计数器加一
                System.out.println("第 " + count +" 完数是: " + num);//输出完数
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历全部完数所使用的时间: " + (end - start) + " 毫秒");
    }
}

5.执行结果

优化后的结果

6.说在后面

上一篇 下一篇

猜你喜欢

热点阅读