大數階乘Java實現
阿新 • • 發佈:2019-02-11
題目
描述 我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它?- 輸入
- 輸入一個整數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(); } }