LeetCode43. 字符串相乘

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Jaster_wisdom/article/details/81515923

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

题目分析:如果两个字符串中有一个为0,则结果是0;否则的话,将其中一个数A的最末位(即个位)和另一个数B相乘,将结果保存到ans数组中去,然后将A的十位与B相乘,将结果累加到ans中去,然后将A的百位与B相乘,加到ans中去……,这里加的时候每次要向后移一位。最后,规范化ans数组,即把数值超过10的那一位向后进一位,使得每位上的值都在0~9之间,最后输出ans即可。

代码展示:

class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1=="0"||num2=="0")
            return "0";
        int numA[110],numB[110];
        for(int i=0;i<num1.length();i++)
            numA[i] = num1[i]-'0';
        for(int i=0;i<num2.length();i++)
            numB[i] = num2[i]-'0';
        int ans[250];
        memset(ans,0,sizeof(int)*250);
        for(int i=num1.length()-1;i>=0;i--){
            int carry = 0;   //表示进位
            for(int j=num2.length()-1;j>=0;j--){
                ans[num1.length()-1-i+num2.length()-1-j] += (numA[i]*numB[j]+carry)%10;
                carry = (numA[i]*numB[j]+carry)/10;
                if(j==0)
                    ans[num1.length()-1-i+num2.length()-1+1] = carry;
            }
        }
        for(int i=0;i<249;i++){
            if(ans[i]>=10){
                ans[i+1] += ans[i]/10;
                ans[i] = ans[i]%10;
            }
        }
        string str = "";
        bool flag = false;
        for(int i=249;i>=0;i--){
            if(ans[i]!=0 || flag){
                str += char(ans[i]+'0');
                flag = true;
            }      
        }
        return str;
    }
};

 

没有更多推荐了,返回首页