完全数的java算法

文章关键字:|完全数|java|算法|完美数|因子|欧几里德|

什么是完全数?
如果一个正整数恰好等于它所有的真因子(即除了自身以外的因子)之和,则称之为完全数(完美数)。
例:6=1+2+3

欧几里德完全数定理:若p、(2的p次幂-1) 这两个值均为素数,则 2的(p-1)次幂 乘以 (2的p次幂-1) 的值是个完全数。
package yzg.arithmetic;

/**
* 欧几里德完全数定理:若p、(2的p次幂-1) 这两个值均为素数,则 2的(p-1)次幂 乘以 (2的p次幂-1) 的值是个完全数。
* 如果一个正整数恰好等于它所有的真因子(即除了自身以外的因子)之和,则称之为完全数(完美数)。 例:6=1+2+3
*
* @author yzg
*
*/
public class EntiretyNumber {

    /**
     * @param args
     */
    public static void main(String[] args) {
        for (long p = 2; p <= 31; p++) {
            if (!pri(p)) {
                continue;
            }
            long t = 2;
            for (int k = 1; k < p; k++) {
                t = t * 2;
            }

            long j = t / 2;
            t--;
            if (pri(t)) {
                System.out.println(j + " * " + t + " = " + (j * t));
            }
        }
        normal();
    }

    // 八个完全数
    // 3 * 2 = 6
    // 7 * 4 = 28
    // 31 * 16 = 496
    // 127 * 64 = 8128
    // 8191 * 4096 = 33550336
    // 131071 * 65536 = 8589869056
    // 524287 * 262144 = 137438691328
    // 2147483647 * 1073741824 = 2305843008139952128

    /**
     * 判断传入的参数是否是一个素数
     *
     * @param suShu
     * @return true=是,false=不是
     */
    public static boolean pri(long suShu) {
        int q = (int) Math.sqrt(suShu) + 1;
        for (int i = 2; i <= q; i++) {
            if (suShu % i == 0 && suShu != 2) {
                return false;
            }
        }
        return true;
    }

    /**
     * 求10000以内的完全数,普通的算法。
     * 找到后,显示成和的形式。
     */
    public static void normal() {
        for (int i = 6; i < 10000; i++) {
            int s = 0;
            for (int j = 1; j <= i / 2; j++) {
                if (i % j == 0) {
                    s += j;
                }
            }

            if (s == i) {
                System.out.print(s + " = 1");
                for (int j = 2; j <= i / 2; j++) {
                    if (i % j == 0) {
                        System.out.print(" + " + j);
                    }
                }
                System.out.println();
            }
        }
    }
}

原文地址:http://www.evget.com/zh-CN/Info/ReadInfo.aspx?id=9194

你可能感兴趣的:(java,算法,J#)