黑马程序员技术交流社区

标题: 怎么求1000!结果里面有多少零呢? [打印本页]

作者: NCry    时间: 2014-11-19 23:11
标题: 怎么求1000!结果里面有多少零呢?
话说1000!结果里面有多少个零?
先来说说1000!=1000*999*998*...*2*1
看着这个很好求,定义一个sum=1,来一个for循环,让sum乘于变量。然后再定义一个count,对sum进行遍历,有o的时候让count自增,获得有count,也就是有多少个零。
看似很简单。可是问题来了。1000的阶层这是一个多大的数?
想一想应该很大!用上面的那个方法,sum定义int类型还没自乘几下就装满了。然后定义为lang类型的,还是不行!那就用最大的double类型的吧。试了下还不行!
怎么办呢?{:3_60:}{:3_60:}{:3_60:}
那就找找有没有别的吧。
话说无意间了解到java的api提供了一个叫BigInteger的类,这个java说可以存入无穷大的数。那就拿来试试吧。
经过计算发现这个结果的长度竟然是2000+{:3_55:}{:3_55:}{:3_55:}
代码如下:
  1. import java.math.BigInteger;
  2. public class JieCheng {

  3.         public static void main(String[] args) {
  4.                 System.out.println(getNum(1000));
  5.         }
  6.         public static int getNum(int num) {
  7.                 BigInteger bi = new BigInteger(1 + "");
  8.                 for (int x = 1; x <= num; x++) {
  9.                         bi = bi.multiply(new BigInteger(x + ""));
  10.                 }
  11.                 String b = bi.toString();
  12.                 System.out.println(b.length());
  13.                 int count = 0;
  14.                 for (int x = 0; x < b.length(); x++) {
  15.                         if (b.charAt(x) == '0') {
  16.                                 count++;
  17.                         }
  18.                 }
  19.                 return count;
  20.         }
  21. }
复制代码
b.length() 的长度2000+.....我去这double类型的怎么可能装的下呢!!!!{:3_46:}{:3_46:}{:3_46:}


作者: NCry    时间: 2014-11-20 17:55
看来还是需要自己沙发!!
作者: chen_32768    时间: 2014-11-20 18:54
以后差不多都要用BigInteger
/*思路:1.因为求出1000!之后数值太大,需要使用math.BigInteger,可以解决大数问题。
*     2.首先创建一个BigInteger对象,容纳计算结果。
*     3.for循环循环相乘。(1*(1+1)*(1+1+1)····*1000)
*     4.得出结果后,将BigInteger的对象用字符串表示。
*     5.for循环,使用str.charAt(i)方法搜寻有多少个0,有的话count++。
*     6.打印结果*/
public class JieChengTo1000 {
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                BigInteger end = new BigInteger("1");
                int count = 0;
                // !1*1000的阶乘,end为接收结果的BigInteger
                for (int i = 1; i <= 1000; i++) {
                        // BigInteger(String val)
                        // 将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
                        // BigInteger为类,需要创建对象
                        end = end.multiply(new BigInteger(i + ""));
                }
                //System.out.println(end);
                String str = end.toString();
                // 遍历字符串。判断为0的时候count+1
                for (int i = 0; i < str.length(); i++) {
                        //比較的是Char類型,所以用''
                        if (str.charAt(i) == '0') {
                                count += 1;
                        }
                }
                System.out.println(count);
        }
作者: 郑飞    时间: 2014-11-20 18:59
本帖最后由 郑飞 于 2014-11-20 19:01 编辑

给个简洁点的
  1.                 BigInteger bi = new BigInteger("1");
  2.                 for(int i = 1;i<=1000;i++)
  3.                         bi = bi.multiply(new BigInteger(i+""));
  4.                 System.out.println(bi.toString().length()-bi.toString().replace("0", "").length());
复制代码

作者: NCry    时间: 2014-11-20 19:00
chen_32768 发表于 2014-11-20 18:54
以后差不多都要用BigInteger
/*思路:1.因为求出1000!之后数值太大,需要使用math.BigInteger,可以解决大 ...

大神求罩啊!{:3_53:}{:3_53:}
作者: NCry    时间: 2014-11-20 19:02
本帖最后由 NCry 于 2014-11-20 19:06 编辑
郑飞 发表于 2014-11-20 18:59
给个简洁点的

是的。这个的确是简洁好多!{:3_67:}
作者: chen_32768    时间: 2014-11-20 19:04
郑飞 发表于 2014-11-20 18:59
给个简洁点的

这才是大神,求技术分
作者: 郑飞    时间: 2014-11-20 19:14
这几天水贴太多 严打 不能给多
说简洁 其实就是强行给弄成4行 代码差不多 看着爽而已
作者: Crazy_Eat_Code    时间: 2014-11-20 19:20
菜鸟路过
作者: NCry    时间: 2014-11-20 19:21
郑飞 发表于 2014-11-20 19:14
这几天水贴太多 严打 不能给多
说简洁 其实就是强行给弄成4行 代码差不多 看着爽而已 ...

是的,看着爽太多了!我是之前一点没接触过这个BigInteger,所以发上来想让更多人看。谢谢大神的币{:3_53:}{:3_53:}
作者: NCry    时间: 2014-11-20 19:22
Crazy_Eat_Code 发表于 2014-11-20 19:20
菜鸟路过

这个头像到处都见。你这16技术分,就不要自称菜鸟了!




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