TSOJ課程 18 1136 高精度乘法

2021-09-19 23:41:49 字數 1350 閱讀 7949

題目描述:

給出兩個長度小於100位的正整數,求其乘積。

輸入描述:
兩行,一行乙個數。

輸出描述:
一行,為所求乘積。

樣例輸入:
1937

2931

樣例輸出:
又是高精度。

其實高精度的加法減法和乘法都大同小異,都是通過模仿手算的方式去實現的。但是乘法的手算如果模擬起來會顯得比較麻煩,所以我們要稍微加強一下。

我們唯一需要搞清楚的是,當某兩個數字相乘以後,結果跑去了哪?

請看如下簡陋圖:

首先我們會先計算a乘上b的最後乙個數的結果,我們發現,a2 x b1的結果我們寫在了c3的位置,a1 x b1的結果我們寫在了c2的位置……。於是我們大膽的猜測,是不是a(m) x b(n)的結果就應該寫在c(m+n)的位置呢?

於是我們進一步驗證:a2 x b0寫在了c2、a0 x b0寫在了c0。很明顯這個規律應該是對的,那麼我們就按照這個去做,把乘法的結果加在對應位置上(比如c2既有a2b0也有a1b1,那麼c2=a2b0 + a1b1),然後如果計算過程**現超過10的數字,就把他進製即可。

對於兩個數字的乘法,我們發現每兩個位置之間都必須要相乘一次。比如說上面舉的例子中a有3位,b有2位,那麼b0和a0~2都乘過,b1也是,一共乘了6次。所以我們只需要寫乙個雙層的for迴圈就可以完成這個乘法了。

另外我們注意到:規律是c(m+n) += a(m)*b(n),那麼m+n的範圍就是0到2倍的m、n的範圍,但是題目也說了答案不會超過200個數字,所以說明輸入的兩個不會超過100個數字,所以你會看到在for迴圈之中,我們的迴圈終止條件是ib參考**:

// tsoj-1136 高精度乘法 

#include

#include

using

namespace std;

#define max_digit 202

struct lnum;}

;lnum _time

(lnum a, lnum b)

}return temp;

}lnum _init

(string a)

return temp;

}void

printlnum

(lnum a)

intmain()

return0;

}

高精度除法(高精度除以高精度)

先貼乙個簡單的高精度除以單精度的 include include include using namespace std int main else ys ys 10 a i 0 while c i 0 i for int j i j 0 j printf d c j if ys printf d ...

高精度除高精度

演算法流程 第一步,讀入被除數 a 和 除數 b,判斷是否 a b,是則輸出 0 並結束演算法,否則令 answer 0 第二步,令餘數 remainder 0,令 i 從被除數最高位的下標開始 第三步,令 remainder remainder 10 a i 令 c 9 第四步,判斷是否 b c ...

高精度除以高精度

原 題 高精除以高精,求它們的商和餘數。演算法分析 高精除以高精是用減法模擬除法,對被除數的每一位都減去除數,一直減到當前位置的數字 包括前面的餘數 小於除數 由於每一位的數字小於10,所以對於每一位最多進行10次計算 代 碼 include include include using namesp...