实际上就是让你写一个大数乘法
大数乘法基本都用模拟竖式了,就是看各种优化
模拟竖式可以先全部计算,然后最后统一进位【这里当然也可以优化,减少一点复杂度】
过程是这样的
先不进位,就全部加起来
然后总的结果是
然后从最后一位【56】,往前判断,如果大于9,就往前进位【121+=56/10,本位=56%10=6】
126大于9,持续这个操作
如果已经到begin且begin任然大于9,那么就插入进位,在这个例子中,本位变为2,插入一个12/.10=1
所以最后的结果就是 12578*97=1220066
附上代码:
#include<iostream>
#include<deque>
#include<list>
#include<string>
using namespace std;
string multiply(string num1, string num2){
string& upper=num1;
string& down=num2;
deque<int> res,adv;
for(int i=0;i<down.length();i++){
if(!res.empty()){
for(int k=0;k<upper.length()-1;k++){
adv.push_back( res.back() );
res.pop_back();
}
}
for(int j=0;j<upper.length();j++){
if(adv.empty())
{
res.push_back(
(down[i]-'0') * (upper[j]-'0')
);
}
else{
res.push_back(
adv.back()+(down[i]-'0') * (upper[j]-'0')
);
adv.pop_back();
}
}
}
//统一处理完毕,开始处理进位
deque<int>::iterator it=res.end()-1;
while(it!=res.begin()-1){
if(*it>9){
//判断是不是第一位
if(it==res.begin()){
int tmp=*it;
*it=tmp%10;
res.push_front(tmp/10);
}else{
int tmp=*it;
*it=tmp%10;
*(it-1)+=tmp/10;
}
}
it--;
}
string _r;
for(it=res.begin();it!=res.end();it++){
_r+=(*it+'0');
}
return _r;
}
int main(){
string numa,numb,numab;
cin>>numa>>numb;
numab=multiply(numa,numb);
cout<<numab<<endl;
return 0;
}