黑马程序员技术交流社区

标题: 编程求1000!末尾有几个零 [打印本页]

作者: 丑小子799    时间: 2014-11-22 08:15
标题: 编程求1000!末尾有几个零
入学测试题,求大神解答
作者: chen_32768    时间: 2014-11-22 08:35
我的注释还是比较清楚地。认真看能看懂,这个方法比较容易明白,就是用一个BigInteger接收结果,还有一种是把0替换成""空,然后算出替换前和替换后的长度差就是有多少个0
  1. package com.test.nine;

  2. import java.math.BigInteger;

  3. /*思路:1.因为求出1000!之后数值太大,需要使用math.BigInteger,可以解决大数问题。
  4. *     2.首先创建一个BigInteger对象,容纳计算结果。
  5. *     3.for循环循环相乘。(1*(1+1)*(1+1+1)····*1000)
  6. *     4.得出结果后,将BigInteger的对象用字符串表示。
  7. *     5.for循环,使用str.charAt(i)方法搜寻有多少个0,有的话count++。
  8. *     6.打印结果*/
  9. public class JieChengTo1000 {
  10.         public static void main(String[] args) {
  11.                 // TODO Auto-generated method stub
  12.                 BigInteger end = new BigInteger("1");
  13.                 int count = 0;
  14.                 // !1*1000的阶乘,end为接收结果的BigInteger
  15.                 for (int i = 1; i <= 1000; i++) {
  16.                         // BigInteger(String val)
  17.                         // 将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
  18.                         // BigInteger为类,需要创建对象
  19.                         end = end.multiply(new BigInteger(i + ""));
  20.                 }
  21.                 //System.out.println(end);
  22.                 String str = end.toString();
  23.                 // 遍历字符串。判断为0的时候count+1
  24.                 for (int i = 0; i < str.length(); i++) {
  25.                         //比較的是Char類型,所以用''
  26.                         if (str.charAt(i) == '0') {
  27.                                 count += 1;
  28.                         }
  29.                 }
  30.                 System.out.println(count);
  31.         }
  32. }
复制代码

作者: 丑小子799    时间: 2014-11-22 09:20
谢了,我自己敲敲试试
作者: kerner    时间: 2014-11-22 09:26
  1. package myfirsttest;
  2. /* 因为1000!值太大,肯定会溢出,可以考虑转换成字符串存贮,效率低。
  3. *
  4. * 参考:《编程之美》
  5. *
  6. * 每个合数都可以写成几个质数相乘的形式。其中每个质数都是这个合数的因数,叫做这个合数的分解质因数。
  7. * N!能产生0的质数组合只能是2 * 5,也就是说当对N!进行质数分解之后,
  8. * N!末尾0的个位M取决于2的个数X和5的个数Y的最小值,即M = min(X,Y)。
  9. * 又因为能被2整除的数出现的频率比能被5整除的数高得多,且出现一个5的时,
  10. * 最少会同时出现一个2,所以M = Y。即得出Y的值就可以得到N!末尾0的个数。

  11. * 计算Y,最直接的方法,就是计算机1…N的因式分解中5的个数,然后求和。
  12. */


  13. /**
  14. * @author kerner
  15. *
  16. */
  17. public class CompositeNumber {
  18.         
  19.         public static final long NUM =1000;
  20.         public static void main(String[] args) {
  21.                
  22.                 int count = 0;
  23.                 int compositeNumber ;
  24.                
  25.                 for(int i = 1; i <= NUM; i++){
  26.                         compositeNumber = i;
  27.                         
  28.                         while(compositeNumber % 5 == 0){ //分解合数,短除法
  29.                                 compositeNumber /= 5;
  30.                                 count++;
  31.                         }
  32.                 }
  33.                
  34.                 System.out.println("1000!="+count);
  35.         }

  36. }
复制代码

作者: kerner    时间: 2014-11-22 09:29
本帖最后由 kerner 于 2014-11-22 17:27 编辑

传送门--质因数分解

修改:
怎么贴不了链接呢???
http://baike.baidu.com/view/832102.htm?from_id=10305400&type=syn&fromtitle=%E8%B4%A8%E5%9B%A0%E6%95%B0%E5%88%86%E8%A7%A3&fr=aladdin


作者: cczheng    时间: 2014-11-22 09:51
这题很常见,楼上都是正解




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2