1. 程式人生 > >大數階乘Java實現

大數階乘Java實現

題目

描述 我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它?
輸入
輸入一個整數m(0<m<=5000)
輸出
輸出m的階乘,並在輸出結束之後輸入一個換行符
樣例輸入
50
樣例輸出
30414093201713378043612608166064768844377641568960512000000000000

思路:用data陣列來存放階乘的每一位數字,首先令第一位的數值為1,位數為1,然後將每次相乘的乘積存回陣列,並迴圈處理每個陣列中超過10的數,若數值超過10,則需要進位,將位數加1,原來的數除以10,商數加前一位數的數值後存回前一位數的陣列中,再將餘數存回原來位數的陣列中。

例如求5!的值

步驟一:
1!=1
位數1
陣列內容0      0      0      1
步驟二:
2!=2*1!=2
位數1
陣列內容0      0      0      2
步驟三:
3!=3*2!=3*2=6
位數1
陣列內容0      0      0      6
步驟四:
4!=4*3!=4*4=24
位數1
陣列內容0      0      0      24
因為24大於10,需要進位
data[1]=data[1]+data[0]/10=0+2=2
data[0]=data[0]%10=4
所以陣列內容為0      0      2      4
位數2
步驟五:
5!=5*4!=5*24=120
位數2
陣列內容為0      0      2*5      4*5
即0      0      10      20
因為data[0]大於10,需要進位
data[1]=data[1]+data[0]/10=10+2=12
data[0]=data[1]%10=0
此時陣列內容為0      0      12      0
data[2]=data[2]+data[1]/10=0+1=1
data[1]=data[1]%10=2
位數加1
陣列內容為0      1      2      0
一次類推,可以計算大數的階乘

程式碼如下:

import java.util.*;

public class Main {
	public static void main(String[] args)
	{
		Scanner input = new Scanner(System.in);
		int[] cal = new int[10010];
		int num = input.nextInt();
		cal[0] = 1;
		for(int index = 1; index <= num; ++index )
		{
			for(int i = 0; i < 10000; i++)
			{
				cal[i] = cal[i]*index;
				
			}
			for(int i = 0; i < 10000; i++)
			{
					cal[i+4] = cal[i+4]+ cal[i]/10000;
				cal[i+3] = cal[i+3]+ cal[i]%10000/1000;
				cal[i+2] = cal[i+2]+ cal[i]%1000/100;
				cal[i+1] = cal[i+1]+ cal[i]%100/10;
				cal[i+0] = cal[i]%10;
				
				
			}
		}
		for(int i3 = 0; i3 < 10004; i3++)
		{
			cal[i3+4] = cal[i3+4]+ cal[i3]/10000;
			cal[i3+3] = cal[i3+3]+ cal[i3]%10000/1000;
			cal[i3+2] = cal[i3+2]+ cal[i3]%1000/100;
			cal[i3+1] = cal[i3+1]+ cal[i3]%100/10;
			cal[i3+0] = cal[i3]%10;
			
		}
		
		int x = 10000;
		while(cal[x] == 0)
			x--;
		for(int i2 = x; i2 >= 0; i2--)
		{
			System.out.print(cal[i2]);
		}
		System.out.println();
		
		
		
	}
	

}