題目描述:
給出兩個長度小於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...