南陽oj 大數階乘 題目28
阿新 • • 發佈:2019-01-25
啊啊啊啊啊啊啊啊啊學的太少了
樣例輸出<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]; //補足五位數 } } }