NYOJ38 大數階乘

來源:互聯網
上載者:User

資料來源: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;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.