黑马程序员技术交流社区

标题: 第9道好纠结,我不知道做的对不对?求指教 [打印本页]

作者: wata    时间: 2014-12-18 15:22
标题: 第9道好纠结,我不知道做的对不对?求指教
本帖最后由 wata 于 2014-12-20 11:28 编辑
  1. /*
  2. 9、 求1000!的结果中包含多少个0?注:1000! = 1×2×3×4×5×...×999×1000

  3. -----------------------------

  4. 思路:

  5. 因为0是由因数10产生的,而10是由2*5产生的,其中每2个数就有一个是2,每5个才有1个是5的倍数。
  6. 所以我们只需要计算并累加:
  7.         1~1000能被5^1(5<=1000)整除的个数
  8.         1~1000能被5^2(25<=1000)整除的个数
  9.         1~1000能被5^3(125<=1000)整除的个数
  10.         1~1000能被5^4(625<=1000)整除的个数
  11. 即可。因为1~1000里面有多少个数是5,25,125,625(均小于1000)的倍数,那么末尾就有多少个0。

  12. */

  13. public class Test09
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 int count = 0;
  18.                 for(int x=1; x<=1000; x++){//1~1000循环。
  19.                         for(int y=5; y<=1000; y*=5){//获取值<=1000,并是5的倍数(5, 25, 125, 625)。
  20.                                 if(x%y==0){//1~1000中能被5,25,125,625整除的个数。
  21.                                         count++;//累加0的个数。
  22.                                 }
  23.                         }
  24.                 }
  25.                 System.out.println("count = "+count);
  26.         }
  27. }
复制代码

现在我知道哪里错了。

原因:

我写的程序只能计算1000!末尾0的个数,而中间的0的个数是没有累加到count中的。

如:205800,这就有三个零。而我的程序只有2个0。所以需要使用大数据BigInteger来解题。

所以楼下“聪明叉”的答案才是对的。




作者: 冥夜    时间: 2014-12-18 15:28
你这个求法求出来的是末尾有几个零,比如10100,你这个求法就是2个零。而且你这个求法没必要除以5的N次方,while循环只要能被5整除就一直除5就行了
作者: wata    时间: 2014-12-18 19:16
本帖最后由 wata 于 2014-12-18 19:26 编辑
冥夜 发表于 2014-12-18 15:28
你这个求法求出来的是末尾有几个零,比如10100,你这个求法就是2个零。而且你这个求法没必要除以5的N次方, ...

我这个程序1000!有249个0。
10100!有2523个0。只要这块代码一改就可以了
  1. for(int x=1; x<=10100; x++){//1~1000循环。
  2.                         for(int y=5; y<=10100; y*=5){//获取值<=1000,并是5的倍数(5, 25, 125, 625)。
  3.                                 if(x%y==0){//1~1000中能被5,25,125,625整除的个数。
  4.                                         count++;//累加0的个数。
  5.                                 }
  6.                         }
  7.                 }
复制代码
我想知道我这个程序有没有错?贴上你的答给我参下哈~

作者: SpiderManZZH    时间: 2014-12-18 19:20
这道题你要分析题目中的结果不光数字的尾数有好多零,中间也有零哦,如205800,这就有三个零。所以需要使用大数据BigInteger
作者: wata    时间: 2014-12-18 19:29
SpiderManZZH 发表于 2014-12-18 19:20
这道题你要分析题目中的结果不光数字的尾数有好多零,中间也有零哦,如205800,这就有三个零。所以需要使用 ...

不懂诶!~能写出具体代码给我参考下吗?{:2_39:}
作者: 十万一千    时间: 2014-12-18 19:58
本帖最后由 十万一千 于 2014-12-18 20:01 编辑

代码:
  1. package com.itheima;

  2. import java.math.BigInteger;

  3. public class 求1000的阶层中的零的数量 {
  4.         public static void main(String[] args) {
  5.                 String resultString = AClass(1000).toString();
  6.                 System.out.println(resultString);
  7.                 int resultStringLength = resultString.length();
  8.                 int count = 0;
  9.                 for (int i = 0; i < resultStringLength; i++) {
  10.                         if ('0' ==  resultString.charAt(i)) {
  11.                                 count++;
  12.                         }
  13.                 }
  14.                 System.out.println(count);
  15.         }

  16.         public static BigInteger AClass(Integer x) {
  17.                 return A(x, x);
  18.         }

  19.         public static BigInteger A(Integer x, Integer y) {
  20.                 BigInteger z = new BigInteger(x.toString());
  21.                 for (int i = 1; i < y; i++) {
  22.                         z = z.multiply(new BigInteger(Integer.toString(x - i)));
  23.                 }
  24.                 return z;
  25.         }
  26. }
复制代码




作者: cz萑    时间: 2014-12-18 20:04
围观。。。。
作者: 聪明叉    时间: 2014-12-18 20:37
  1. package com.itheima;

  2. import java.math.BigInteger;

  3. /**
  4. * 9、 求1000!的结果中包含多少个0?注:1000! = 1×2×3×4×5×...×999×1000
  5. *
  6. * 思路:1.因为求出1000!之后数值太大,需要使用math.BigInteger,可以解决大数问题。
  7. *     2.首先创建一个BigInteger对象,容纳计算结果。
  8. *     3.for循环循环相乘。(1*(1+1)*(1+1+1)····*1000)
  9. *     4.得出结果后,将BigInteger的对象用字符串表示。
  10. *     5.for循环,使用str.charAt(i)方法搜寻有多少个0,有的话count++。
  11. *     6.打印结果
  12. *
  13. */
  14. public class Test9 {
  15.   public static void main(String args[])
  16.   {
  17.           BigInteger result = new BigInteger("1");//新建一个值为1的BigInteger对象
  18.           int count = 0;//计数值为0
  19.          
  20.           for(int i = 2 ; i <=1000 ; i++)
  21.           {
  22.                   result = result.multiply(new BigInteger(i+""));//循环相乘,得出结果。
  23.           }
  24.           String str = result.toString();//将其变为string类型
  25.          
  26.          
  27.           for(int i = 0 ; i <str.length(); i++)//将结果(字符串)遍历一遍。
  28.           {
  29.                  if(str.charAt(i) == '0')//当有"0"时候,count++作为计数。
  30.           {
  31.                   count++;//计数,每有一个0就增加1.
  32.                   
  33.           }
  34.           }
  35.          
  36.           System.out.println(count);//输出结果。
  37.   }
  38. }

复制代码

作者: wata    时间: 2014-12-19 08:30
聪明叉 发表于 2014-12-18 20:37

很好的解答了我的问题,thinks~
作者: 我只是一只菜鸟    时间: 2014-12-19 09:08
大数据BigInteger的确没学过,可以查下API。
作者: 菜鸟一号    时间: 2014-12-19 09:42
你确定int类型能存1000!吗?
作者: 南柯一梦境    时间: 2014-12-19 10:08
都是大神啊,又学一样
作者: xiao飞    时间: 2014-12-19 11:18
感觉很复杂啊
作者: edidada    时间: 2014-12-20 19:48
标题: 计算尾巴有多少个零,对楼主的代码更改了下

  1. public class countZero {

  2.         public static void main(String[] args) {
  3.                 int count =0;
  4.                 for(int i =5;i<=1000;i+=5){
  5.                         for(int j=5;j<=i;j=j*5){
  6.                                 if(i%j==0){
  7.                                         count++;
  8.                                 }
  9.                         }
  10.                 }
  11.                 System.out.println(count);
  12.         }

  13. }
复制代码


作者: 找寻小龙猫    时间: 2014-12-20 20:04
又学到了。。。谢谢楼主




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