28!计算结果是错的!为何?

weidan 2004-03-16 08:15:08
/*
设计一个可容纳40位数(int)的求n!的程序
*/

public class Factorial40th
{
public static void main(String[] args)
{
final int numBits = 28;
int[] arrBits = new int[40];
int digit = 1;//数据位数

arrBits[0] = arrBits[1] = 1;
for(int i=1; i<numBits+1; i++)
{
for(int j=1; j<digit+1; j++)
{
arrBits[j] *= i;
}
for(int j=1; j<digit+1; j++)
{
if(arrBits[j] > 10)
{
for(int r=1; r<digit+1; r++)
{
if(arrBits[digit] > 10)
{
digit++;
}
arrBits[r+1] += arrBits[r]/10;
arrBits[r] = arrBits[r]%10;
}
}
}
System.out.print(i + "! = ");
for(int k=digit; k>0; k--)
{
System.out.print(arrBits[k]);
}
System.out.println();
}
}
}


1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 0888869450418352160768000000
28! = 34888344611713860501504000000//right:304888344611713860501504000000

28!计算结果是错的!为何?
...全文
89 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
weidan 2004-03-18
  • 打赏
  • 举报
回复
谢谢79cy!
79cy 2004-03-17
  • 打赏
  • 举报
回复
是溢出了,不过是你设计上的溢出,你在的程序最高位与要乘的数的乘积位100以内的数时时没问题的,但是如果这个数超过100,由于你只判断最高位大于10时,位数加1没考虑更大时的情况,所以产生了溢出,导致最高位缺失了.
以27!为例:
27!=26!*27=403291461126605635584000000*27
很明显最高位4*27=108,但是统计位数时只是简单加1,导致了最高位缺失.所以后面的运算都会出错.
同时个人认为这种方法不如用BIGINTEGER好,因为阶乘如果N!中N很大时,每次位数进位位N的位数加1才可以.
79cy 2004-03-17
  • 打赏
  • 举报
回复
我验算了一下你的结果好像27!的就不对了,
应该是10888869450418352160768000000
而不是 0888869450418352160768000000.
weidan 2004-03-17
  • 打赏
  • 举报
回复
谢谢诸位!
用一个能容纳40个数的数据来存储计算结果,每个数组单元arrBits[X]中的数是不会超过10的整数,代码中已写明:
for(int j=1; j<digit+1; j++)
{
 if(arrBits[j] > 10)
 {
  for(int r=1; r<digit+1; r++)
  {
   if(arrBits[digit] > 10)
   {
    digit++;
   }
   arrBits[r+1] += arrBits[r]/10;
   arrBits[r] = arrBits[r]%10;
  }
 }
}
超过10的数已进入下一数组单元了!
ilovehuhu 2004-03-16
  • 打赏
  • 举报
回复
不好意思 ,看错了,当我上面没说。:S
jinsfree 2004-03-16
  • 打赏
  • 举报
回复
溢出了,你27看看是什么,都是0XXXXXx
ilovehuhu 2004-03-16
  • 打赏
  • 举报
回复
你的数组下标是从0到39,但是你的arrBits[0]其实没有用到,所以你只能用1到39这39个数位,在算28!时结果有四十位。所以你的数组给小了一位。你改成长度41试试看。
wilddonkey 2004-03-16
  • 打赏
  • 举报
回复
BigInteger
79cy 2004-03-16
  • 打赏
  • 举报
回复
很明显正确答案比错误答案多一位啊,是溢出了.
lasersong2004 2004-03-16
  • 打赏
  • 举报
回复
溢出了! 21!就已经超过了Integer.MAX_VALUE:2147483647.
另外,求阶乘不用这么麻烦吧.

int result=1;
int i;
for(int j=1;j<21;j++){
for(i=1;i<=j;i++){
result=result*i;
}
System.out.println(j+"! = "+result);
result=1;
}

要求更大的用BigInteger。

江南编程浪子 2004-03-16
  • 打赏
  • 举报
回复
用BigInteger类就可以实现无限长整数啊,需要那么麻烦嘛?
iheshi 2004-03-16
  • 打赏
  • 举报
回复
没有仔细看你的程序。用递归的方法就好啊。不用那么麻烦的。
iheshi 2004-03-16
  • 打赏
  • 举报
回复
可能是溢出了吧。我觉得好像只有溢出了才会出现这种情况。
注意一下在运算过程中也会强制转换的。
fast_time 2004-03-16
  • 打赏
  • 举报
回复
莫名其妙,不知道你要干什么
求阶乘要这样做吗?
zhang21cnboy 2004-03-16
  • 打赏
  • 举报
回复
40位数的(int)是什么意思?兄弟?

是不是就是40个int阿?如果是的话,那没什么问题,能算出一个的,还能算不出40个得吗?

这种问题,用递归比较方便。

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧