java 阶乘 最大整数_计算超大整数的阶乘(java)

思想

思想来自于网上,将所有的计算结果每一位存储到数组中,利用十进制,每次阶乘对数组中的每一位与目标阶乘,然后计算进位,比如:8!= 5040*8={5,0,4,0}*8={40,0,32,0}={4,0,3,2,0}

代码实现

/**

* 计算大整数的阶乘

*@param bigNumber

*/

public static void getBigFactorial(long bigNumber){

if (bigNumber<0){

throw new IllegalArgumentException("参数必须为非负数");

}

//数组长度

double length =0;

//总位数

int count = 0;

//记录最高位

int maxIndex = 0;

//计算最终数组的长度

for (int i=1;i<= bigNumber;i++){

length += Math.log10(i);

}

//最终结果数组,结果按照倒序存放

long[] result = new long[(int)length+1];

result[0]=1;

for (int i=1;i<=bigNumber;i++){

//获取最高位下标位置

maxIndex = getMaxIndex(result);

//从个位开始向后计算每一位的结果

for (int j=0;j<=maxIndex;j++){

result[j]*=i;

}

//a为进位数

long a = 0;

//将数组进位

for (int j=0;j<=maxIndex;j++){

//当前位加上进位

result[j]+=a;

if (result[j]<=9){

//下一位不需要进位

a=0;

}else if (result[j]>9 && j

//记录进位

a = result[j]/10;

//当前位

result[j]%=10;

}else if (result[j]>9&&j>=maxIndex){

//最高位,循环进位

while (result[j]>9){

a = result[j]/10;

result[j]=result[j]%10;

//最高位保留进位

result[++j]=a;

}

}

}

}

int zeroCount = 0;

for (int i=result.length-1;i>=0;i--){

count++;

if (result[i] == 0){

zeroCount++;

}else {

zeroCount = 0;

}

System.out.print(result[i]);

if (count%40==0) {

System.out.println();

}else if (count%5==0){

System.out.print(" ");

}

}

System.out.println("\n计算结束,总位数:"+count+"\t 末尾0的个数:"+zeroCount);

}

/**

* 获取数组最高位下标位置

*@param arr

*@return

*/

private static int getMaxIndex(long[] arr){

for (int i=arr.length-1;i>=0;i--){

if (arr[i]!=0){

return i;

}

}

return 0;

}

测试结果

public static void main(String[] args) {

long start = System.currentTimeMillis();

getBigFactorial(1000);

long end = System.currentTimeMillis();

System.out.println("计算用时: "+(end-start)+" ms");

}

40238 72600 77093 77354 37024 33923 00398 57193

74864 21071 46325 43799 91042 99385 12398 62902

05920 44208 48696 94048 00479 98861 01971 96058

63166 68729 94808 55890 13238 29669 94459 09974

24504 08707 37599 18823 62772 71887 32519 77950

59509 95276 12087 49754 62497 04360 14182 78094

64649 62910 56393 88743 78864 87337 11918 10458

25783 64784 99770 12476 63288 98359 55735 43251

31853 23958 46307 55574 09114 26241 74743 49347

55342 86465 76611 66779 73966 68820 29120 73791

43853 71958 82498 08126 86783 83745 59731 74613

60853 79534 52422 15865 93201 92809 08782 97308

43139 28444 03281 23155 86110 36976 80135 73042

16168 74760 96758 71348 31202 54785 89320 76716

91324 48426 23613 14125 08780 20800 02616 83151

02734 18279 77704 78463 58681 70164 36502 41536

91398 28126 48102 13092 76124 48963 59928 70511

49649 75419 90934 22215 66832 57208 08213 33186

11681 15536 15836 54698 40467 08975 60290 09505

37616 47584 77284 21889 67964 62449 45160 76535

34081 98901 38544 24879 84959 95331 91017 23355

55660 21394 50399 73628 07501 37837 61530 71277

61926 84903 43526 25200 01588 85351 47331 61170

21039 68175 92151 09077 88019 39317 81141 94545

25722 38655 41461 06289 21879 60223 83897 14760

88506 27686 29671 46674 69756 29112 34082 43920

81601 53780 88989 39645 18263 24367 16167 62179

16890 97799 11903 75403 12746 22289 98800 51954

44414 28201 21873 61745 99264 29565 81746 62830

29555 70299 02432 41531 81617 21046 58320 36786

90611 72601 58783 52075 15162 84225 54026 51704

83304 22614 39742 86933 06169 08979 68482 59012

54583 27168 22645 80665 26769 95865 26822 72807

07578 13918 58178 88965 22081 64348 34482 59932

66043 36766 01769 99612 83186 07883 86150 27946

59551 31156 55203 60939 88180 61213 85586 00301

43569 45272 24206 34463 17974 60594 68257 31037

90084 02443 24384 65657 24501 44028 21885 25247

09351 90620 92902 31364 93273 49756 55139 58720

55965 42287 49774 01141 33469 62715 42284 58623

77387 53823 04838 65688 97646 19273 83814 90014

07673 10446 64025 98994 90222 22176 59043 39901

88601 85665 26485 06179 97023 56193 89701 78600

40811 88972 99183 11021 17122 98459 01641 92106

88843 87121 85564 61249 60798 72290 85192 96819

37238 86426 14839 65738 22911 23125 02418 66493

53143 97013 74285 31926 64987 53372 18940 69428

14341 18520 15801 41233 44828 01505 13996 94290

15348 30776 44569 09907 31524 33278 28826 98646

02789 86432 11390 83506 21709 50025 97389 86355

42771 96742 82224 87575 86765 75234 42202 07573

63056 94988 25087 96892 81627 53848 86339 69099

59826 28095 61214 50994 87170 12445 16461 26037

90293 09120 88908 69420 28510 64018 21543 99457

15680 59418 72748 99809 42547 42173 58240 10636

77404 59574 17851 60829 23013 53580 81840 09699

63725 24230 56085 59037 00624 27124 34169 09004

15369 01059 33983 83577 79394 10970 02775 34720

00000 00000 00000 00000 00000 00000 00000 00000

00000 00000 00000 00000 00000 00000 00000 00000

00000 00000 00000 00000 00000 00000 00000 00000

00000 00000 00000 00000 00000 00000 00000 00000

00000 00000 00000 00000 00000 00000 00000 00000

00000 00000 00000 00000 00000 00000 00000 00000

00000 000

计算结束,总位数:2568 末尾0的个数:249

计算用时: 25 ms

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值