LeetCode 43 大数相乘

  • 分析

     模拟平时我们手算乘法的步骤,对于因数的每一位先做乘法,然后在做加法,具体代码如下。

  • 代码
class Solution {
public:
    string add(string num1, string num2){//加法
        string ans = "";
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        int jin = 0;
        int sum = 0;

        while(0 <= i && 0 <= j){
            sum = jin + (num1[i] - 48) + (num2[j] - 48);            
            jin = sum / 10;
            ans = (char)(sum % 10 + 48) + ans;
            i--;
            j--;
        }
        while(0 <= i){
            sum = jin + (num1[i] - 48);
            jin = sum / 10;
            ans = (char)(sum % 10 + 48) + ans;
            i--;
        }
        while(0 <= j){
            sum = jin + (num2[j] - 48);
            jin = sum / 10;
            ans = (char)(sum % 10 + 48) + ans;
            j--;
        }
        if(jin != 0){
            ans = "1" + ans;
        }
        return ans;
    }

    string multemp(string num1, string num2){//乘法
        int i = num1.length() - 1;
        int number = num2[0] - 48;
        string out = "";
        int jin = 0;
        int sum;
        while(i >= 0){
            sum = jin + (num1[i] - 48) * number;
            jin = sum / 10;
            out = (char)(sum % 10 + 48) + out;
            i--;
        }
        if(jin != 0){
            out = (char)(jin + 48) + out;
        }
        return out;
    }

    string multiply(string num1, string num2) {
        int len1 = num1.length();
        int len2 = num2.length();
        string temp = "";
        string ans = "";
        string wei = "";

        if(len2 > len1){
            temp = num1;
            num1 = num2;
            num2 = temp;
            swap(len2, len1);
        }
        for(int i = len2 - 1; i >= 0; i--){
            temp = multemp(num1, num2.substr(i, 1));
            
            temp += wei;
            ans = add(temp , ans);            
            wei += "0";
        }

        if(atoi(ans.c_str()) == 0){
            return "0";
        }

        return ans;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值