- package myfirsttest;
 
 - /* 因为1000!值太大,肯定会溢出,可以考虑转换成字符串存贮,效率低。
 
 -  * 
 
 -  * 参考:《编程之美》
 
 -  * 
 
 -  * 每个合数都可以写成几个质数相乘的形式。其中每个质数都是这个合数的因数,叫做这个合数的分解质因数。
 
 -  * N!能产生0的质数组合只能是2 * 5,也就是说当对N!进行质数分解之后,
 
 -  * N!末尾0的个位M取决于2的个数X和5的个数Y的最小值,即M = min(X,Y)。
 
 -  * 又因为能被2整除的数出现的频率比能被5整除的数高得多,且出现一个5的时,
 
 -  * 最少会同时出现一个2,所以M = Y。即得出Y的值就可以得到N!末尾0的个数。
 
  
-  * 计算Y,最直接的方法,就是计算机1…N的因式分解中5的个数,然后求和。
 
 - */
 
  
 
- /**
 
 -  * @author kerner
 
 -  *
 
 -  */
 
 - public class CompositeNumber {
 
 -         
 
 -         public static final long NUM =1000;
 
 -         public static void main(String[] args) {
 
 -                 
 
 -                 int count = 0;
 
 -                 int compositeNumber ;
 
 -                 
 
 -                 for(int i = 1; i <= NUM; i++){
 
 -                         compositeNumber = i;
 
 -                         
 
 -                         while(compositeNumber % 5 == 0){ //分解合数,短除法
 
 -                                 compositeNumber /= 5;
 
 -                                 count++;
 
 -                         }
 
 -                 }
 
 -                 
 
 -                 System.out.println("1000!="+count);
 
 -         }
 
  
- }
 
 
  复制代码 |