参考于这篇博客 https://www.cnblogs.com/wmx24/p/9064134.html
相较于我之前的版本https://blog.youkuaiyun.com/dyyzlzc/article/details/103239509,这个非常简洁,确实是算法的精髓,我之前的那个有点拖沓,虽然原理是对的,并且这个复杂度只有O(n*m)
#include<iostream>
#include<cstring>
#include<string>
#include <algorithm>
using namespace std;
void mul(string& a,string& b){
reverse(a.begin(),a.end()); //把两个乘数都翻转,方便使用for in range便利,自己用i也可以
reverse(b.begin(),b.end());
int *r=new int[a.size()+b.size()]; //乘法最多位数就是两个数的位数之和,提前申请好
memset(r,0,sizeof(int)*(a.size()+b.size())); //全部0填充
int pos=a.size()+b.size()-1; //从最后一位开始计算
for(auto down : b){
int _pos=pos; //从最后往前填充
for(auto up : a){
int bit=(up-'0')*(down-'0'); //先计算下面*上面的
bit+=r[_pos]; //加上低位的进位,一开始低位进位是0
if(bit>=10){ //如果比10大
r[_pos]=bit%10; //当前位为结果的进位
r[_pos-1]+=bit/10; //把进位加到前一位去
}else{
r[_pos]=bit; //如果加上进位比10小,直接填入即可
}
_pos--;
}
pos--;
}
//显示结果
cout<<endl;
for(int i=0;i<a.size()+b.size();i++){
cout<<(int)r[i]<<" ";
}
string re("aaa");
}
int main(){
string a="12312234234";
string b="998349853984";
mul(a,b);
}