美文网首页Java 核心技术十二点大学@IT·互联网
题目9:找出1000以内的所有完数

题目9:找出1000以内的所有完数

作者: Hughman | 来源:发表于2017-02-12 20:03 被阅读513次

    题目:

    一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。

    程序分析:

    1)遍历i从2到1000的数;
      2)对这个数i从1到a-1进行除,然后将所有能整除a的数进行相加得sum;
      3)如果sum==a,则说明a为完数,否则,不是。

    程序代码:

    package com.ljy.tencent;
    /**
     * 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。
     * 例如6=1+2+3.编程找出1000以内的所有完数。
     * 思路:
     * 1)遍历i从2到1000的数;
     * 2)对这个数i从1到a-1进行除,然后将所有能整除a的数进行相加得sum,
     * 3)如果sum==a,则说明a为完数,否则,不是。
     * @author liaojianya
     * 2016年10月6日
     */
    public class WanShu
    {
        static int count = 0;
        public static void main(String[] args)
        {
            //循环判断输出1~1000之间所有的完数
            System.out.println("以下为1000以内的完数:");
            for(int i = 2; i <= 1000; i++)
            {
                checkIs(i);
            }
            System.out.println();
            System.out.println("1000以内的完数一共有" + count + "个。");
        }
        //判断是否为完数
        public static void checkIs(int i)
        {
            int sum = 0;
            //用1~i-1去整除i,如果能被整除,则j即为i的因子,加到sum中去。
            for(int j = 1; j < i; j++)
            {
                if(i % j == 0)
                {
                    sum += j;
                }
            }
            //如果i所有因子相加后的sum和i本身的值相同,则i为完数,并计数加一。
            if(sum == i)
            {
                count++;
                System.out.print(i + "\t");
            }
        }
    

    结果输出:

    以下为1000以内的完数:
    6      28      496
    1000以内的完数一共有3个。
    

    相关文章

      网友评论

      • yia宁:暴力计算啊。。。
        Hughman:@yia宁 嗯?
      • 5822c4c0196e:一个更快的方法需要用到梅森素数和完全数的性质。
        由 Euclid-Euler 定理,一个数 n 是偶完全数,当且仅当n = 2^{k-1} (2^k - 1),其中 2^k - 1 是一个梅森素数。 由于还没发现奇完全数,所以我们遍历从2-9的素数,根据该定理,就能快速登出完数。本法也可以应用到任何上限。
        Hughman:你是不是学数学的?这个定理没有接触过,所以想不到额

      本文标题:题目9:找出1000以内的所有完数

      本文链接:https://www.haomeiwen.com/subject/utnaittx.html