A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© NCry 中级黑马   /  2014-11-19 23:11  /  1590 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

话说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:}

评分

参与人数 1黑马币 +5 收起 理由
郑飞 + 5 赞一个!

查看全部评分

10 个回复

倒序浏览
NCry 来自手机 中级黑马 2014-11-20 17:55:08
沙发
看来还是需要自己沙发!!
回复 使用道具 举报
以后差不多都要用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);
        }

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 郑飞 于 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());
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
chen_32768 发表于 2014-11-20 18:54
以后差不多都要用BigInteger
/*思路:1.因为求出1000!之后数值太大,需要使用math.BigInteger,可以解决大 ...

大神求罩啊!{:3_53:}{:3_53:}
回复 使用道具 举报
本帖最后由 NCry 于 2014-11-20 19:06 编辑

是的。这个的确是简洁好多!{:3_67:}
回复 使用道具 举报

这才是大神,求技术分

评分

参与人数 1黑马币 +5 收起 理由
郑飞 + 5 这几天水贴太多 严打 不能给多.

查看全部评分

回复 使用道具 举报
郑飞 高级黑马 2014-11-20 19:14:06
8#
这几天水贴太多 严打 不能给多
说简洁 其实就是强行给弄成4行 代码差不多 看着爽而已
回复 使用道具 举报
菜鸟路过
回复 使用道具 举报
NCry 中级黑马 2014-11-20 19:21:01
10#
郑飞 发表于 2014-11-20 19:14
这几天水贴太多 严打 不能给多
说简洁 其实就是强行给弄成4行 代码差不多 看着爽而已 ...

是的,看着爽太多了!我是之前一点没接触过这个BigInteger,所以发上来想让更多人看。谢谢大神的币{:3_53:}{:3_53:}
回复 使用道具 举报
NCry 中级黑马 2014-11-20 19:22:30
11#

这个头像到处都见。你这16技术分,就不要自称菜鸟了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马