資料來源:http://hi.baidu.com/shiranon/item/96a611111ad1667b71d5e8a1
一、遞迴方法
這個是最容易想的,如果是1的階乘,則返回1,其他的都返回n-1的階乘與n的積,迴圈調用即可。不過問題是即使用double來存放該值,由於double本身的精度、能存的數字大小所限,算不了太大的數的階乘。
二、數組方法
思路:用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
AC代碼:
#include<iostream>#include<cstring>using namespace std;int main(){int Data[16325];int digit;int i,j,r,k;int N;for(i=1;i<=16325;i++)Data[i]=0;Data[0]=1;Data[1]=1;digit=1;cin>>N;for(i=1;i<=N;i++) //階乘 {for(j=1;j<=digit;j++) //各位相乘Data[j]=Data[j]*i; for(j=1;j<=digit;++j) //某位超過值,需進行進位元運算if(Data[j]>10) {for(r=1;r<=digit;r++){if(Data[digit]>9)digit++; //進位,位元加一Data[r+1]=Data[r+1]+Data[r]/10; //本位+進位 Data[r]=Data[r]%10; //求餘} }}for(k=digit;k>0;k--){cout<<Data[k];}cout<<endl;return 0;}