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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蒋文辉 中级黑马   /  2015-1-20 23:09  /  3018 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
int p=1;
for(int i=2;i<1001;i++){p=p*i;}为什么算出结果是0?


最佳答案

查看完整内容

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

11 个回复

倒序浏览
本帖最后由 小棽 于 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. }
复制代码
回复 使用道具 举报
数值太大的原因,1乘到1000早就超过int的最大值了,~就是把int改成long,都打不出这个值,实在太大,乘到50的时候已经是个天文数字了
回复 使用道具 举报
int型的数据存放不下了 你那阶乘结果太大了
回复 使用道具 举报
最后的结果已经远远超出了int类型的范围了,超出的1部分被截断了,所以显示0
回复 使用道具 举报
这个阶乘是很可怕的,就像那个故事中讲的向国王求赏在棋盘中以2的幂函数放稻谷一样,数值太大了,早就超出了int的范围了
回复 使用道具 举报
呵呵。应该提示超出精度了吧。

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

建议转换类型吧。 换成long吧!!!
回复 使用道具 举报
应该是数据过大超出int类型数值范围。
回复 使用道具 举报
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;
回复 使用道具 举报
乘法溢出了。
回复 使用道具 举报
恩,就是这样!
回复 使用道具 举报
这个数太大了,就是long也得不出结果的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马