力扣oj-字串相乘

Li-eng發表於2020-11-14

字串相乘

給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。

示例 1:

輸入: num1 = “2”, num2 = “3” 輸出: “6” 示例 2:

輸入: num1 = “123”, num2 = “456” 輸出: “56088” 說明:

num1 和 num2 的長度小於110。 num1 和 num2 只包含數字 0-9。 num1 和 num2 均不以零開頭,除非是數字0 本身。
不能使用任何標準庫的大數型別(比如 BigInteger)或直接將輸入轉換為整數來處理。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/multiply-strings

主要解題思路

1.把兩個數字都存在陣列裡 (vector, 在這裡我是從num的最後一位開始,

把每一位尾插到陣列裡,也就是發生了一下逆序,方便後續操作

2.每一位相乘的結果也存在陣列裡 : c[i+j]+=a[i]*b[j]。這裡用加號是因為有多種情況都會對映到 i + j 位上。

3.最後在處理進位 從低位開始處理 ,一直往高位進 c[i + 1] = c[i] / 10, c[i] %= 10

4.使用 res=ch+res;這樣每次得到的一個字元相當於直接頭插了。

一個整理樣例
在這裡插入圖片描述

程式碼如下

class Solution {
public:
    string multiply(string num1, string num2) {
        string res;
        if(num1=="0"||num2=="0")
        {
           return res="0";
        }
        vector<int> a,b,c;
        int i;
        c.resize(num1.size()+num2.size()-1);
        for(i=num1.size()-1;i>=0;i--)a.push_back(num1[i]-'0');
        for(i=num2.size()-1;i>=0;i--)b.push_back(num2[i]-'0');        


        for(i=0;i<a.size();i++)
        {
            for(int j=0;j<b.size();j++)
            {
                c[i+j]+=a[i]*b[j];
            }
        }
        int k=0;
        for(i=0;i<c.size();i++)
        {
            k+=c[i];
            char ch=k%10+'0';
            res=ch+res;
            k/=10;
        }
        while(k)
        {
            char ch=k%10+'0';
            res=ch+res;
            k/=10;
        }
        return res;
    }
};

相關文章