C 模擬大數乘法 以及 大數階乘

2021-10-02 21:19:35 字數 2356 閱讀 1620

大數階乘

最最最重要的總結部分

寫在開頭:

大數的運算一直以來都是乙個具有研究性的問題, 自己動手模擬了一下筆算乘法, 以及由乘法拓展出來的階乘, 和大家分享一下思路及**

比如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的最大值後就放棄了這種想法。然後就想到了大數乘法,由於以前只寫過大數加,所以比賽時一時沒有...