漫画:如何实现大整数相乘?(上)
戳藍字“CSDN云計算”關注我們哦!
前一段時間,小灰發布了一篇有關大整數相加的漫畫,沒看過的小伙伴可以先看一看:
漫畫:如何實現大整數相加?
那么,大整數相乘又是如何實現的呢?
起初,小灰認為只要按照大整數相加的思路稍微做一下變形,就可以輕松實現大整數相乘。但是隨著深入的學習,小灰才發現事情并沒有那么簡單......
—————? 第二天? —————
怎樣列出這個乘法豎式呢?以 93281 X 2034 為例,豎式如下:
在程序中,我們可以利用int型數組,把兩個大整數按位進行存儲,再把數組中的元素像小學豎式那樣逐個進行計算。
這個乘法豎式的計算過程可以大體分為兩步:
1.整數B的每一個數位和整數A所有數位依次相乘,得到中間結果。
2.所有中間結果相加,得到最終結果。
/**
* 大整數求乘積
* @param bigNumberA ?大整數A
* @param bigNumberB ?大整數B
*/
public static String multiply(String bigNumberA, String bigNumberB) {
? ?//1.把兩個大整數用數組逆序存儲,數組長度等于兩整數長度之和
? ?int lengthA = bigNumberA.length();
? ?int lengthB = bigNumberB.length();
? ?int[] arrayA = new int[lengthA];
? ?for(int i=0; i< lengthA; i++){
? ? ? ?arrayA[i] = bigNumberA.charAt(lengthA-1-i) - '0';
? ?}
? ?int[] arrayB = new int[lengthB];
? ?for(int i=0; i< lengthB; i++){
? ? ? ?arrayB[i] = bigNumberB.charAt(lengthB-1-i) - '0';
? ?}
? ?//2.構建result數組,數組長度等于兩整數長度之和
? ?int[] result = new int[lengthA+lengthB];
? ?//3.嵌套循環,整數B的每一位依次和整數A的所有數位相乘,并把結果累加
? ?for(int i=0;i<lengthB;i++) {
? ? ? ?for(int j=0;j<lengthA;j++) {
? ? ? ? ? ?//整數B的某一位和整數A的某一位相乘
? ? ? ? ? ?result[i+j] += arrayB[i]*arrayA[j];
? ? ? ? ? ?//如果result某一位大于10,則進位,進位數量是該位除以10的商
? ? ? ? ? ?if(result[i+j] >= 10){
? ? ? ? ? ? ? ?result[i+j+1] += result[i+j]/10;
? ? ? ? ? ? ? ?result[i+j] = result[i+j]%10;
? ? ? ? ? ?}
? ? ? ?}
? ?}
? ?//4.把result數組再次逆序并轉成String
? ?StringBuilder sb = new StringBuilder();
? ?//是否找到大整數的最高有效位
? ?boolean findFirst = false;
? ?for (int i = result.length - 1; i >= 0; i--) {
? ? ? ?if(!findFirst){
? ? ? ? ? ?if(result[i] == 0){
? ? ? ? ? ? ? ?continue;
? ? ? ? ? ?}
? ? ? ? ? ?findFirst = true;
? ? ? ?}
? ? ? ?sb.append(result[i]);
? ?}
? ?return sb.toString();
}
public static void main(String[] args) {
? ?String x = "3338429042340042304302404";
? ?String y = "12303231";
? ?System.out.println(multiply(x, y));
}
————————————
下面,我們的推導會有一些燒腦,請大家坐穩扶好~~
大整數從高位到低位,被平分成了兩部分。設整數1的高位部分是A,低位部分是B;整數2的高位部分是C,低位部分是D,那么有如下等式:
如果把大整數的長度抽象為n,那么:
因此,整數1與整數2 的乘積可以寫成下面的形式:
如此一來,原本長度為n的大整數的1次乘積,被轉化成了長度為n/2的大整數的4次乘積(AC,AD,BC,BD)。
什么是master定理呢?
master定理的英語名稱是master theorem,它為許多由分治法得到的遞推關系式提供了漸進時間復雜度分析。
設常數a >= 1,b > 1,如果一個算法的整體計算規模 T(n)?=??a T(n / b) + f(n),那么則有如下規律:
假設兩個長度為n的大整數相乘,整體運算規模是T(n) 。
根據剛才得到的結論,兩個大整數相乘被拆分成四個較小的乘積:
所以在第一次分治時,T(n)和T(n/2)有如下關系:
T(n) = 4T(n/2) + f(n)
其中f(n)是4個乘積結果相加的運算規模,f(n)的漸進時間復雜度很明顯是O(n)。
把這個關系帶入到master定理的公式 T(n)?=??a T(n / b) + f(n) 當中,
此時?a=4, b=2。
此時,把a和b的值,以及f(n)的時間復雜度帶入到master定理的第一個規律,也就是下面的規律:
發現正好符合條件。
怎么符合呢?推導過程如下:
所以我們的平均時間復雜度是:
—————END—————
1.微信群:
添加小編微信:color_ld,備注“進群+姓名+公司職位”即可,加入【云計算學習交流群】,和志同道合的朋友們共同打卡學習!
2.征稿:
投稿郵箱:liudan@csdn.net;微信號:color_ld。請備注投稿+姓名+公司職位。
推薦閱讀
細數華為核心技術家底:華為真會被擊垮嗎?
如何使用 Lucene 做網站高亮搜索功能?
20張圖表達程序員的心酸
一個程序員父親的呼吁:不要教你的孩子從小學編程!
Python | 7招教你識別一個網站是否是Django后臺
月薪 50K 大牛整理!6 張 Python 圖譜,看完茅塞頓開!
程序人生公眾號是CSDN旗下有影響力的開發者自媒體之一。這是一個以程序員日常工作和生活緊密相關且垂直服務于程序員群體的自媒體平臺,掃描關注吧~
↓點擊“閱讀原文”,打開APP 閱讀更順暢
總結
以上是生活随笔為你收集整理的漫画:如何实现大整数相乘?(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 圣诞抽奖 | 2018年的开发者,经历了
- 下一篇: 读研期间一定得看论文吗_读研期间各阶段的