大數階乘
最最最重要的總結部分
寫在開頭:大數的運算一直以來都是乙個具有研究性的問題, 自己動手模擬了一下筆算乘法, 以及由乘法拓展出來的階乘, 和大家分享一下思路及**
比如50的階乘結果是65位, 而 int 的範圍是 10 ^ 9, long long 的範圍是 10 ^ 18模擬筆算乘法, 如圖
由於我們對筆算乘法已經了然於心, 因此幾乎不用思考就能算出結果, 但是如果我們慢下來一步一步思考, 我們可以發現一些規律
計算乘法時, 每次都是拿 23 的一位數, 與 123 相乘, 相乘次數是 2 次, 即 23 的位數;
而拿3 或 2 與 123 相乘時, 相乘次數是3, 即123的位數;
計算加法時, 每次都需要向左偏移一位
發現這些規律後, 可以發現
開始動手
模擬筆算乘法
為了方便, 我從下標 0 開始處理資料, 讀取後需要逆轉一下資料, 所以我先使用字元陣列(即字串)讀取資料, 處理後在轉移到整形陣列
#include
#include
#include
using namespace std;
#define int(x) (x - '0')
intmain()
, num2[
105]
=, ret[
205]=;
char n1[
105]
, n2[
105]
;scanf
("%s%s"
, n1, n2)
;//這幾步只是單純方便讀取及逆序處理
int len1 =
strlen
(n1)
, len2 =
strlen
(n2)
;reverse
(n1, n1 + len1)
;reverse
(n2, n2 + len2)
;for
(int i =
0; i < len1; i++
)for
(int i =
0; i < len2; i++
)//模擬筆算乘法
int carry;
int t[
100]
, temp;
int tlen, offset =
0, rlen;
for(
int i =
0; i < len2; i++)if
(carry)
carry =0;
//此處為加法進製
rlen = offset;
//偏移位 筆算中每次向左偏移一位 因為在這裡逆序儲存 所以變成向右偏移一位
既然大數乘法我們都解決, 那麼大數階乘也是相同思路, 每次都是兩個數相乘, 不過要注意的是, 我這裡輸入的資料是在 int 範圍內的, 所以就不用使用字串來儲存乘數, 只需要乙個資料來儲存結果即可
#include
using namespace std;
intmain()
//處理進製
//此時由於不像大數乘法那樣兩個數都是個位數相乘
//有可能是多位數乘單位數, 所以進製不止一位
//需要迴圈處理進製, 一直到進製為0
while
(carry)
}for
(int i = digit-
1; i >=
0; i--
)//倒序輸出每一位
無[狗頭]
模擬乘法運算之N的階乘(大數階乘)
基於aoj 787和51nod 1057討論n的階乘問題。在這裡,討論的大數階乘的演算法主要是模擬乘法運算,我們用乙個乘數和另乙個乘數各位相乘,則該乘積的個位為結果的一位,該乘積的高位均為進製。需要注意的是,各位乘完後,進製可能是個多位數,則該多位數可以直接輸出。我們可以設定乙個陣列w k 來儲存乘...
階乘之和 大數乘法和大數加法
時間限制 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 0 n 10000 求取n的階乘 輸入描述 多個測試資料,每個測試資料輸入乙個數n 輸出描述 每組用一行輸出n的階乘 輸入 12 3輸出 1 26思路 剛看到時我以為是打表,但是看到n的最大值後就放棄了這種想法。然後就想到了大數乘法,由於以前只寫過大數加,所以比賽時一時沒有...