1. 程式人生 > >南陽oj 大數階乘 題目28

南陽oj 大數階乘 題目28


啊啊啊啊啊啊啊啊啊學的太少了
<h2>大數階乘</h2><div class="problem-ins"> 時間限制:<span class="editable highlight" id="problem[time_limit]">3000</span> ms  |            記憶體限制:<span class="editable highlight" id="problem[memory_limit]">65535</span> KB </div><div class="problem-ins">難度:<span class="editable highlight">3</span></div><div class="clr"></div><dl class="problem-display"><dt>描述 </dt><dd>我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它?</dd><div class="clr"></div><dl class="others"><dt>輸入</dt><dd>輸入一個整數m(0<m<=5000)</dd><dt>輸出</dt><dd>輸出m的階乘,並在輸出結束之後輸入一個換行符</dd><dt>樣例輸入</dt><dd><pre id="sample_input">50
樣例輸出
30414093201713378043612608166064768844377641568960512000000000000
來源經典題目上傳者張雲聰
#include<iostream>
#include<iomanip>
using namespace std;
//儲存20000以內的階乘
int a[15470];       //用陣列來儲存結果,每個元素存一個五位數
int main()
{
    int n;
    cin>>n;
    a[1]=1;       
    a[0]=1;       //這個a[0]是個計數器,記錄五位數的個數
    int up;       //向前一個五位數的進位
    for(int i=2;i<=n;++i)         //從2到n的乘數
    {                             
        up=0;                    //乘完每個乘數進位歸零
        for(int j=1;j<=a[0];++j)   //已有數值位參與運算
        {
            a[j] *=i;             //每一個五位數乘以乘數
            a[j] +=up;            //加上進位
            up=a[j]/100000;        //計算下一個進位
            a[j] %=100000;         //當前五位數的值
        }
        if(up!=0)
        {
            a[0]++;                //若有進位,計數器加一
            a[a[0]]=up;            //存放進位
        }
    }
    if(a[0]==1) cout<<a[1];
        else
        {
            cout<<a[a[0]];
            for (int i=a[0]-1;i>0;i--)
            {     
                cout<<setfill('0')<<setw(5)<<a[i];  //補足五位數
            }
        }
}