1*2*...*1000的末尾有多少个0?(Java实现)

来源:互联网 发布:天猫淘宝不卖烟? 编辑:程序博客网 时间:2024/05/21 08:54

/**
* 算法描述:
* 分解质因数,即:
* 1*2*3*...*1000 = (2*5)*(2*5)*...*(2*5)
                    *(没有匹配的2或5) //其实地球人都知道2肯定比5多
                                                  //这样其实只需要确定因子5的个数即可
                    *(除2和5以外的其他质因数)
* 其因子中有多少个(2*5)即末尾有多少个0
* 因此问题变成求每个数中2和5因子的个数,再求和
* 最后min(因子2个数的总和,因子5个数的总和)即是所求。
*/
public class SumZero {
  SumZero(){
   max = 1000;//默认值是1000
  }
  SumZero(int n){
   max = n;//可以通过构造函数修改max的值
  }
  
  private int max;
  /**
   * 得到max的因子 m 的个数
   */
  public int getFactor(int m){
   int  count = 0,
         n = max;
  
   //try 中的便是程序的核心
   try{
    while(n%m == 0){//能被m整除则count++
     count++;
     if(n >= m){
      n /= m;
     }
    }
   }
   catch(Exception e){
    e.printStackTrace();
   }
  
   return count;  
  }
  
  /**
   * 得到末尾0的个数
   */
  public int getNumber(){
   int count_2 = 0,//因子2的个数
        count_5 = 0;//因子5的个数

   for(int i = 1;i<=max;i++){
    count_2 += getFactor(i,2);//其实没有必要求因子2的个数
    count_5 += getFactor(i,5);
   }
  
   return Math.min(count_2,count_5);//必定有:count_5 < count_2
  }
  public static void main(String[] args){
   System.out.println("1*2*...*1000的末尾有"
                                     +new SumZero().getNumber()
                                     +"个0");
  }
}

///另一种做法(用 BigInteger)

By:believefym

import java.math.*;
public class OneK {
    public static void main(String[] args) {
        BigInteger b = BigInteger.valueOf(1);
        for(int i=1; i<=1000; i++){
            b = b.multiply(BigInteger.valueOf(i));
        }
        String tmp = b.toString();
        int counter=0;
        for(int i=tmp.length()-1; i>0; i--){
            if(tmp.charAt(i)=='0')
                counter++;
            else
                break;
        }
        System.out.println(counter);//249
    }
}

原创粉丝点击