1000的阶乘如何实现?

1000的阶乘是一个非常之大的数字,在看到这个问题的第一个反应就是,直接运算肯定会溢出,事实也如此,我们如何解决这个问题呢?
我们小学的时候就会计算这样的乘法:123*9
三九二十七 进二写七 7 2
二九十八 十八加二等于二十 进二写零 0 2
一九得九 九加二 十一 进一写一 1 1

最后的结果是1107

[size=large][color=red]如何计算阶乘结果的位数?[/color][/size]
方法一:
log1+log2+log3+log4+...+logn 取整加1
方法二:
斯特林公式

按照这样的步骤,把每次得到的结果存放到数组里,考虑到无法确定数组长度,采用ArrayList
实现如下:

public static void factorial(int value) {
ArrayList result = new ArrayList();
int carryBit = 0;

result.add(new Integer(1));
for (int out = 2; out <= value; out++) {
for (int in = 0; in < result.size(); in++) {
int temp = ((Integer) result.get(in)).intValue() * out
+ carryBit;
result.set(in, new Integer(temp % 10));
carryBit = temp / 10;
}
while (carryBit != 0) {
result.add(new Integer(carryBit % 10));
carryBit = carryBit / 10;
}
}
StringBuffer sb=new StringBuffer(result.size());
for(int i=0;i<result.size();i++)
{
sb.append(result.get(i));
}
sb=sb.reverse();
System.out.println("result="+sb);
System.out.println("结果位数"+result.size());
}


运行结果:

1!
result=1
结果位数1
2!
result=2
结果位数1
3!
result=6
结果位数1
4!
result=24
结果位数2
5!
result=120
结果位数3
6!
result=720
结果位数3
7!
result=5040
结果位数4
8!
result=40320
结果位数5
9!
result=362880
结果位数6

1000!
result=4023872600770937735437024339230039857193748642107146325437999104299385123
9862902059204420848696940480047998861019719605863166687299480855890132382966994
4590997424504087073759918823627727188732519779505950995276120874975462497043601
4182780946464962910563938874378864873371191810458257836478499770124766328898359
5573543251318532395846307555740911426241747434934755342864657661166779739666882
0291207379143853719588249808126867838374559731746136085379534524221586593201928
0908782973084313928444032812315586110369768013573042161687476096758713483120254
7858932076716913244842623613141250878020800026168315102734182797770478463586817
0164365024153691398281264810213092761244896359928705114964975419909342221566832
5720808213331861168115536158365469840467089756029009505376164758477284218896796
4624494516076535340819890138544248798495995331910172335555660213945039973628075
0137837615307127761926849034352625200015888535147331611702103968175921510907788
0193931781141945452572238655414610628921879602238389714760885062768629671466746
9756291123408243920816015378088989396451826324367161676217916890977991190375403
1274622289988005195444414282012187361745992642956581746628302955570299024324153
1816172104658320367869061172601587835207515162842255402651704833042261439742869
3306169089796848259012545832716822645806652676995865268227280707578139185817888
9652208164348344825993266043367660176999612831860788386150279465955131156552036
0939881806121385586003014356945272242063446317974605946825731037900840244324384
6565724501440282188525247093519062092902313649327349756551395872055965422874977
4011413346962715422845862377387538230483865688976461927383814900140767310446640
2598994902222217659043399018860185665264850617997023561938970178600408118897299
1831102117122984590164192106888438712185564612496079872290851929681937238864261
4839657382291123125024186649353143970137428531926649875337218940694281434118520
1580141233448280150513996942901534830776445690990731524332782882698646027898643
2113908350621709500259738986355427719674282224875758676575234422020757363056949
8825087968928162753848863396909959826280956121450994871701244516461260379029309
1208890869420285106401821543994571568059418727489980942547421735824010636774045
9574178516082923013535808184009699637252423056085590370062427124341690900415369
0105933983835777939410970027753472000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000

结果位数2568
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值