近期碰到個求大數階乘的題目,大意如下
原題來自pat基礎函式題
起初未考慮輸出超大數問題,直接printf輸出結果,但當數增大到一定程度後就無法正常輸出這才認識到到%d輸出範圍有限(中間還從%d到%ld,再到%lld做了努力。。。)。
查詢下資料發現超大數問題可以通過字元形式輸出結果,下面分享下我的示例
#include void print_factorial(const int n);
int main()
int result[3000]; //儲存計算結果
int num[3000]; //儲存臨時資料
void print_factorial(const int n) //階乘函式
if (carry != 0)
}int z = 0;
for (int n = num_index-1; n >=0; n--)//該迴圈用來倒排兩個陣列
乘法規則:將乘數與被乘數的低位到高位依次相乘,加上每位計算的進製數,依次得到每一位的結果。
程式模擬時,無論乘數有多少位,都將乘數看成乙個整體,與低位相乘加上該位的進製數得到臨時變數,取臨時變數的最後一位得到我們需要的一位(%10),除去最低位後的數作為下一位的餘數(carrry = temp/10)。被乘數每一位乘完之後,如果餘數不為0,將其依次放入結果中。
示例:234*12
先計算12*4=48,得temp=48+0=48
留下8,進製數為4
接著計算12*3=36,得temp=36+4=40
留下0,進製數為4
繼續計算12*2=24,得temp=24+4=28
留下8,進製數為2
最後被乘數乘完,進製數為2,直接放置。
得到的結果為2808。
由於乘得的結果低位先確定高位後確定,而陣列也是低位先確定高位後確定,故將得到的臨時結果低位放到陣列的低位,得到臨時結果陣列num。最後倒排得到最終的結果陣列result。
實現大數階乘加法 1006 笨階乘
通常,正整數 n 的階乘是所有小於或等於 n 的正整數的乘積。例如,factorial 10 10 9 8 7 6 5 4 3 2 1。相反,我們設計了乙個笨階乘 clumsy 在整數的遞減序列中,我們以乙個固定順序的操作符序列來依次替換原有的乘法操作符 乘法 除法 加法 和減法 例如,clumsy...
階乘之和 大數乘法和大數加法
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 用高精度計算出s 1!2!3!n!n 50 其中 表示階乘,例如 5!54321。輸入正整數n 輸出計算結果s 輸入 3輸出 9利用數學方式計算大數。牛客...
N的階乘 大數階乘
輸入n求n的階乘的準確值。input 輸入n 1 n 10000 output 輸出n的階乘 首先,要確定n的階乘的數字大概有多少位,這樣便於我們去選擇合適的演算法。階乘 當n 10000時,上式值為35660 已經向上取整 所以接受 include include include include ...