输出400以内的Smith数。Smith数是指满足下列条件的可分解的整数:其所有数位上的数字和=其全部素数因子的数字总和
例如:9975是Smith数,9975=3*5*5*7*19 ,即全部素数因子的数字总和。

解决方案 »

  1.   

    [java学习]给人写的求400内的SMITH数
    素数判定算法比较臭,时间复杂太大...算很大的数会等到你吐血,求改进版 
    /** 
    *SMITH.java 
    *Author:ArEs 
    */ 
    import java.util.ArrayList; public class SMITH{ 
    //取得素数因子表
    public ArrayList getPrimeFactor(int num){ 
    ArrayList pfList=new ArrayList(); 
    int pf=2; if(isPrime(num)){ 
    pfList.add(0,num); 
    return pfList; 

    while(pf<num){ if(isPrime(pf)){ 
    if(num%pf==0){ 
    pfList.add(pf); 
    num/=pf; 
    pf=1; 
    if(isPrime(num)){ 
    pfList.add(num); 
    break; 



    pf++; 

    return pfList; 

    //各位上的数字之和
    public int getBitAdd(int num){ int sum=0; 
    while(num!=0){ 
    sum+=num%10; 
    num/=10; 

    return sum; 
    } //素数判断
    public boolean isPrime(int num){ 
    int i=2; 
    if(num<=1)return false; for(;i<num;i++){ 
    if(num%i==0)break; 

    if(i<num)return false; 
    else return true; 
    } public static void main(String []args){ 
    int smith=2; 
    int pf=0; 
    SMITH s=new SMITH(); 
    ArrayList pfList=new ArrayList(); while(smith<400){ pfList=s.getPrimeFactor(smith); 
    pf=0; 
    for(int i=0;i<pfList.size();i++){ 
    pf+=s.getBitAdd(Integer.parseInt(pfList.get(i).toString())); //这里有没有其他方法?
    }; 
    if(s.getBitAdd(smith)==pf){ 
    System.out.println (smith+"\t"+pfList); 

    smith++; 



    //http://blog.donews.com/ArEs/archive/2005/06/07/416438.aspx
      

  2.   

    http://www.java-cn.com/bbs-jsp/show.jsp?id=144949