大数乘法。给定两个数字表示为字符串,返回乘数的数字作为一个字符串。

217 篇文章 1 订阅
174 篇文章 2 订阅

本题源自LeetCode

----------------------------------------

思路 :

用一个字符串存结果长度为字符串1加上字符串2 的和,

1 双重循环,将俩个字符串从尾到头遍历,将字符串1 的每一位相乘字符串2 的每一位赋值给结果字符串。

2  是否有进位,

3 最后截取结果字符串第一位不是0的的非零子串

代码1:

    string multiply(string num1, string num2) {
        int len1=num1.length();
        int len2=num2.length();
        string result(len1+len2,'0');
        int carry=0;
        for(int i=len1-1;i>=0;i--){
            int a=num1[i]-'0';
            for(int j=len2-1;j>=0;j--){
                int b=num2[j]-'0';
                int c=result[i+j+1]-'0';
                int num=a*b+c+carry;  //低位相乘+进位+原值
                result[i+j+1]=num%10+'0';
                carry=num/10;  //求进位
            }
            if(carry){
                result[i]=carry+'0';
                carry=0;
            }
        }
        int i=0;
        while(i<result.length()&&result[i]=='0')
            i++;
        return i==result.length()?"0":result.substr(i);
    }


代码2:

 string multiply(string num1, string num2) {
        int len1=num1.length();
        int len2=num2.length();
         
        vector<int> tmp(len1+len2,0);
         
        string res(len1+len2,'0');
         
        for(int i=len1-1;i>=0;i--)
        {
            for(int j=len2-1;j>=0;j--)
                tmp[i+j+1]+=(num1[i]-'0')*(num2[j]-'0');  //从tmp第一位开始
        }
         
        int carry=0;    //进位
         
        for(int i=len1+len2-1;i>0;i--)       //从个位开始
        {
            tmp[i]+=carry;
            carry=tmp[i]/10;
            tmp[i]=tmp[i]%10;
            res[i]=tmp[i]+'0';
        }
        if(carry){   
            res[0]=carry+'0';   //第0位没用。判断最高位是否有进位
            carry=0;
        }
        int i=0;
        while(res[i]=='0'&&i<res.length())
            i++;
         
        return i==res.size()?"0":res.substr(i);
    }

大数加法

string add(string num1,string num2)
{
    int len1=num1.size();
    int len2=num2.szie();
     
    int maxLen=max(len1,len2);
     
    vector<int> tmp(maxLen+1,0);
    string res(maxLen+1,'0');
     
    int carry=0;
    int i=len1-1;
    int j=len2-1;
    int k=maxLen;
     
    while(i>=0&&j>=0)
    {
        int cur=(num1[i]-'0'+num2[j]-'0')+carry;
        tmp[k--]=cur%10;
        carry=cur/10;
    }
     
   while(i>=0)
   {
       int cur=(num1[i]-'0')+carry;
       tmp[k--]=cur%10;
       carry=cur/10;
   }
     
   while(j>=0)
   {
       int cur=(num2[j]-'0')+carry;
       tmp[k--]=cur%10;
       carry=cur/10;
   }
    
   for(int i=0;i<maxLen+1;i--)
   {
        res[i]=tmp[i]+'0';
   }
     
   int t=0;
   while(t<res.size()&&res[t]=='0')
        t++;
   return t==res.size()?"0":res.substr(t);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值