- 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);
- }
- }
复制代码 |