完美数-java

来源:互联网 发布:asp.net博客源码 编辑:程序博客网 时间:2024/06/08 20:07

算法一

import java.util.Scanner;//完美数计算/*一个数等于它的真约数之和真约数=一个数的除它本身的其它约数eg 6=1+2+3*/public class PerfectNumber {    public static void main(String[] args){        System.out.println("请输入完美数范围:");        Scanner scan=new Scanner(System.in);        int n=scan.nextInt();        int i,j,s,k=0;        int a[]=new int[100];        /*        i 控制范围从0--n之间的数是否为完美数        j 控制0--i之间数        k 如果j是因数放在数组a中        s 计算因数的和就是这个数本身。        */        for( i=1;i<=n;i++){            k=0;//每次循环a数组下标从零开始            for(j=1;j<i;j++){                if(i%j==0){                    a[k]=j;                    k++;                }            }            s=0;//每此计算s都要清零            for(int z=0;z<k;z++){               s=s+a[z];            }            if(s==i){                System.out.println(s);            }        }    }}

算法二
计算比较大的完美数

//完美数/*根据完全数公式  大数学家欧几里德曾推算出完全数的获得公式:如果2^p-1质数,那么(2^p-1)X2^(p-1)便是一个完全数。  例如p=2,2^p-1=3是质数,(2^p-1)X2^(p-1)=3X2=6,是完全数。  例如p=3,2^p-1=7是质数,(2^p-1)X2^(p-1)=7X4=28,是完全数。*/public class PerfectNumber2 {     //筛选法求素数    public  void prime(int n){        long a[]=new long[n];        int j;        for(int i=2;i<Math.sqrt(a.length);i++){            if(a[i]==0){               j=i*i;               while(j<a.length){                   a[j]=1;                   j=j+i;               }            }        }        //计算        for(int i=2;i<14;i++){           int  p=(int) (Math.pow(2, i)-1);           if(a[p]==0){               System.out.println(p*(int) Math.pow(2, i-1));           }        }    }    public static void main(String[] args) {        PerfectNumber2 p=new PerfectNumber2();        p.prime(50000000);    }}

这里写图片描述

速率加快了不少 哈哈 第一次博客。