兩個大數相乘,字符串模擬+必定技巧

本人是經過以前看到的博主知道的,而後今天又碰到了相似的題目,仍是要記錄一下,否則又忘記還得去找。ios

 

經過用字符串徹底模擬兩個數相乘,相信你們確定是能作到了(是否是徹底模擬的是否是特TM難受)。可是在模擬的基礎上加上一些技巧,效率就變得不同了,代碼也變得簡潔了。數組

 

主要想法:把二個乘數的每一位拆分出來(字符串很好作到)分別放到一個數組中(其實乘數自己就是一個字符數組),而後進行兩兩相乘,獲得另外一個結果數組。spa

表示爲 res[i+j] += (num1[i]-'0')*(num[j]-'0'); 其中i表示num1中數字字符的位置,j表示num2中數字字符的位置, -'0'是把數字字符轉成數字。code

 

如下是以:1234*1234爲例blog

 

第一步:兩兩相乘獲得結果數組res[i+j] += (num1[i]-'0')*(num[j]-'0');字符串

 

 

 

畫的很差不要介意,哈哈。string

 

 

 

 

 

 第二步:經過結果數組拿到最終1234*1234的結果字符串字符串。it

 

 

 

代碼以下:io

 

#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>


using namespace std;

string mulNums(string a, string b) {
    // 建立兩兩相乘後結果的數組,大小可見。 
    vector<int> res(a.size()+b.size()-1, 0); 
    string ret; 
    // res[i+j] += (num1[i]-'0')*(num[j]-'0');
    for (int i = 0; i < a.size(); i++) {
        for (int j = 0; j < b.size(); j++) {
            res[i+j] += (a[i]-'0')*(b[j]-'0');
        }
    }
    // 結果數組轉最終結果 
    int flag = 0;
    int m;
    for (int i = res.size()-1; i >= 0; i--) {
        m = res[i]+flag;
        ret = (char)(m%10+'0')+ret;
        flag = m/10;
    }
    if (flag)
        ret = (char)(flag+'0')+ret;
    return ret;
}


int main() {
    
    cout << mulNums("12345", "67890111") << endl;
    
    return 0;
}
相關文章
相關標籤/搜索