大数相乘

                                        大数相乘

题目

 

代码

#include <string>
#include <vector>
#include <iostream>
using namespace std;

class Solution {
public:
    string multiply(string num1, string num2) 
    {
        string res = "";
        if(num1 == "0" || num2 == "0")  //若有一个乘数为0,则返回“0”
            return "0";
        int size1 = num1.size(),size2 = num2.size();  //两个乘数的位数
        vector<long long>temp(size1+size2-1);  //一个i位数乘以一个j位数,结果至少为i+j-1位数
         //每一位进行笛卡尔乘法
        for(int i=0; i<size1; i++) 
        {
            int a = num1[i] - '0';
            for(int j=0; j<size2; j++)
            {
                int b = num2[j] - '0';
                temp[i+j] += a*b;
            }
        }
        //进行进位处理,注意左侧为高位,右侧为低位
        int carry = 0;
        for(int i=temp.size()-1; i>=0; i--)
        {
            int t = temp[i] + carry;
            temp[i] = t%10;
            int c =temp[i] + '0';
            res.insert(res.begin(),c);  //将第i位数字保存成字符串中的字符
            carry = t/10;
        }
        //若遍历完仍然有进位
        while(carry != 0)
        {
            int t = carry %10;
            char c = t+'0';
            carry /= 10;
            res.insert(res.begin(),c);
        }
        return res;
    
    }
};

int main(){
    string st1,st2;
    cin>>st1;
    cin>>st2;
    Solution solution_;
    string result = solution_.multiply(st1, st2);
    cout << result;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值