思考ING 发表于 2008-3-29 01:07

找完全数

编一个程序,求1000内的所有完全数~~~~~~~~~
同上个题一样,不知道那种约数怎么写代码,另麻烦也编一下吧~~~~~~~~~

meteor57 发表于 2008-3-29 10:37

完全数
【定义】若一个自然数,恰好与除去它本身以外的一切因数的和相等,这种数叫做完全数。
例如,6=1+2+3  
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248
8128=1+2+4+8+16+32+64+127+254+508+1016+2032+4064
【公式】大数学家欧几里德曾推算出完全数的获得公式:如果2^p-1质数,那么(2^p-1)2^(p-1)便是一个完全数。p=2,2^p-1=3是质数,(2^p-1)2^(p-1)=3X2=6,p=3,2^p-1=7是质数,(2^p-1)2^(p-1)=7X4=28

参考资料:
http://baike.baidu.com/view/19074.htm?fr=topic

看完上面,是不是容易多了?
这里只算1000以内的.没有优化...

public class example2 {
        public static void main(String[] args) {
                final int MAX = 1000;
                int i=2;
                System.out.println("1000以内的完全数是:");
                        while(true)
                        {
                                int prime=(int) (Math.pow(2,i)-1);
                                int temp = (int) ((Math.pow(2,i)-1)*(Math.pow(2,(i-1))));
                                if(temp > MAX)break;
                                int j =2;
                                while(j <= Math.sqrt(prime) )//计算是否是质数
                                {
                                        if(prime%j == 0)
                                                break;
                                        j++;
                                }
                        if(j >Math.sqrt(prime))//prime是质数,根据前面的理论,可得temp是完全数.打印.
                            System.out.print(temp+"\t");
                        i++;
                   }
        }
}

思考ING 发表于 2008-3-29 16:12

好~~~~~~~~~~
谢了啊~~~~~~~~~
知道数学算法比直接求解ms要简单许多哦~~~~~~~~~

页: [1]

编程论坛