大数乘法包含大数加法(分治法)

题目:
用串的形式表示大数的乘法。

即求类似: “23234845847839461464158174814792” * “6457847285617487843234535”
要求结果返回一个串。

思路:

  1. 大数乘法的思路就是把一个长的数字串拆分成两个部分,子串a1和子串a2,然后结果就是a1+00…000+a2。递归的边界条件就是当每个子串的长度都小于等于4的时候,就可以通过直接*运算返回结果。
  2. 大数乘法中必须用到大数加法,而大数加法的思路和大数乘法也是大同小异的,将串a和串b的末尾都切出一段长度为8的子串出来,a从左到右子串分别是a1和a2,b亦然。之后就是考虑t=a2+b2的不同情况,有可能t.size<8,那么这个时候我们就要通过补0的方式凑够8位。
#include<iostream>
#include<sstream>
#include<stdlib.h>
using namespace std;

int stringtoInt(string s){
    int ans=atoi(s.c_str());
    return ans;
}           

string inttoString(int i){
    stringstream ss;
    ss<<i;
    string s=ss.str();
    return s;
} 

string add(string a,string b){
    if(a.size()<=8&&b.size()<=8)
    return inttoString(stringtoInt(a)+stringtoInt(b));

    string a1="0";
    string a2=a;
    if(a.size()>8){
        a1=a.substr(0,a.size()-8);
        a2=a.substr(a.size()-8);
    }
    string b1="0";
    string b2=b;
    if(b.size()>8){
        b1=b.substr(0,b.size()-8);
        b2=b.substr(b.size()-8);
    }

    string t=add(a2,b2);
    while(t.size()<8)t="0"+t;
    if(t.size()>8)return add(add(a1,b1),"1")+t.substr(1);
    return add(a1,b1)+t;

}

string zero(int n){
    if(n==0){
        return "";
    }
    if(n==1){
        return "0";
    }

return  zero(n/2)+zero(n/2)+zero(n%2);
}           

string multi(string a,string b){
    if(a.size()<=4&&b.size()<=4){
        return inttoString(stringtoInt(a)*stringtoInt(b));
    }
    if(a.size()>4){
        int k=a.size()/2;
        string a1=a.substr(0,k);
        string a2=a.substr(k);

        return add(multi(a1,b)+zero(a2.size()),multi(a2,b));
    }
    return multi(b,a);
}


int main(){
    string s1="12345678909876543216664321666";
    string s2="12345678901234567895555678955";
    cout<<multi(s1,s2)<<endl;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值