黑马程序员技术交流社区

标题: 求解1000! [打印本页]

作者: 蒋文辉    时间: 2015-1-20 23:09
标题: 求解1000!
int p=1;
for(int i=2;i<1001;i++){p=p*i;}为什么算出结果是0?



作者: 小棽    时间: 2015-1-20 23:09
本帖最后由 小棽 于 2015-1-22 20:26 编辑

因为乘积出来的结果太大,在基本数据类型中没有可以存放这么大数值的数据类型,只能使用对象来做,在java的API中提供了bigInteger类,来做大数据的运算,具体实现代码如下:
  1. package com.itheima;

  2. import java.math.BigInteger;

  3. /**
  4. * 求1000!
  5. *
  6. */
  7. public class Test9 {
  8.         public static void main(String[] args) {
  9.                 BigInteger bi = new BigInteger("1");   //定义一个大整形对象,并给初始值
  10.                 for(int x = 2; x < 1001; x++){
  11.                         bi = bi.multiply(BigInteger.valueOf(x));   //将x转成大数据对象,并与bi进行乘法运算
  12.                 }
  13.                 System.out.println(bi);   //打印结果
  14.         }
  15. }
复制代码

作者: boy259695    时间: 2015-1-21 00:01
数值太大的原因,1乘到1000早就超过int的最大值了,~就是把int改成long,都打不出这个值,实在太大,乘到50的时候已经是个天文数字了

作者: cuixinfu    时间: 2015-1-21 00:13
int型的数据存放不下了 你那阶乘结果太大了
作者: 范建海    时间: 2015-1-21 22:45
最后的结果已经远远超出了int类型的范围了,超出的1部分被截断了,所以显示0
作者: 流星划过的黎明    时间: 2015-1-22 00:24
这个阶乘是很可怕的,就像那个故事中讲的向国王求赏在棋盘中以2的幂函数放稻谷一样,数值太大了,早就超出了int的范围了
作者: 初_学者    时间: 2015-1-22 19:31
呵呵。应该提示超出精度了吧。

你的取值的区域超过了范围。

建议转换类型吧。 换成long吧!!!
作者: yanqiuqiu    时间: 2015-1-26 08:53
应该是数据过大超出int类型数值范围。
作者: 安鑫东    时间: 2015-1-27 22:35
public static void main(String[] args) {
                long s = 65536*65536L;//2^33 在二进制中刚好超过int数据范围
                int n = 1;
                long sum = 1L;
                while(true){
                        sum *= n;
                        n++;
                        if(sum >= s){//当n的阶乘大于超出int的32位的时候 跳出
                                break;
                        }
                }
                System.out.println("n ="+ n);
n = 14;
作者: sixleaves    时间: 2015-2-4 19:41
乘法溢出了。
作者: 蜡笔3285    时间: 2015-2-9 08:33
恩,就是这样!
作者: godrick007    时间: 2015-4-19 17:43
这个数太大了,就是long也得不出结果的。




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