#leetcode刷题之路43-字符串相乘

给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。

#include <iostream>
#include <string.h>
using namespace std;

string multiply(string num1, string num2) {
    int l1=num1.length();
    int l2=num2.length();
    int i;
    string ans;
    if(l1 == 0 || l2 == 0) return "";
    if(num1 == "0" || num2 == "0") return "0";
    int *t = new int[l1+l2];
    //memset(t,0, (l1+l2)* sizeof(int));
    fill(t,t+l1+l2,0);
    for(i = l1-1; i >=0; i--) {//从个位向前
        for(int j =l2-1; j >=0; j--) {//从个位向前
            int multi = (num1[i]-'0') * (num2[j]-'0');//存对应的数字相乘的结果
            multi += t[i+j+1];//先把这一次的值加上之前的最后一位,看会不会进位
            t[i+j] += multi/10;
            t[i+j+1] = multi % 10;
        }
    }
    i = 0;
    while(i < l1+l2 && t[i] == 0)
        i++;//找到非零数的位置
    for(; i < l1+l2; i++)
        ans+=to_string(t[i]);
    return ans;
}

int main() {
    string s1="123";
    string s2="456";
    string ans=multiply(s1,s2);
    std::cout << ans << std::endl;
    return 0;
}

 

posted @ 2019-03-27 23:12  maitianpt  阅读(248)  评论(0编辑  收藏  举报