从零起步看算法(第五天 4.10)
//q7 A*B
本题重点:大数乘法
1.一开始以为和大数加法相似,最后发现有很多不同,就当练习大数加法了。
#include<stdio.h>
#include<string>
#include<cstring>
#include<iostream>
#include<assert.h>
#include<cmath>
#include<algorithm>
using namespace std;
char sum[100000+5];
void mul(string s1,string s2,int len1,int len2){
int len=0;//长度
int p=0;//进位
for(;len1>0||len2>0;len1--,len2--){
if(len1>0&&len2>0){
sum[len]=(((s1[len1]-'0')*(s2[len2]-'0')+p)%10)+'0';
p=(((s1[len1]-'0')*(s2[len2]-'0')+p)/10);
}
else if(len1<=0){
sum[len]=(((s2[len2]-'0')+p)%10)+'0';
p=((s2[len2]-'0')+p)/10;
}
else{
sum[len]=(((s1[len1]-'0')+p)%10)+'0';
p=((s1[len1]-'0')+p)/10;
}
len++;
}
if(p>0)
cout<<p+'0';
for(int i=len-1;i>=0;i--){//末尾下标
cout<<sum[i];
}
}
int main(){
string s1,s2;
cin>>s1;
cin>>s2;
int len1=s1.size();
int len2=s2.size();
mul(s1,s2,len1,len2);
cout<<endl;
return 0;
}
2.学习优秀代码
(1).string s(s1+s2,'0');//string初始化
(2).s=s.substr(1.s.size()); //在串s中从位置为1,取到位置为s.size();
(3).i*j 则乘积结果为m+n-1位(最高位无进位)或m+n位(最高位有进位)
#include<stdio.h>
#include<string>
#include<cstring>
#include<iostream>
#include<assert.h>
#include<cmath>
#include<algorithm>
using namespace std;
string BigNumMultiply(string str1,string str2)
{
int size1=str1.size(),size2=str2.size();
string str(size1+size2,'0');
for(int i=size2-1;i>=0;--i)
{
int mulflag=0,addflag=0;
for(int j=size1-1;j>=0;--j)
{
int temp1=(str2[i]-'0')*(str1[j]-'0')+mulflag;
mulflag=temp1/10;
temp1=temp1%10;
int temp2=str[i+j+1]-'0'+temp1+addflag;
str[i+j+1]=temp2%10+48;
addflag=temp2/10;
}
str[i]+=mulflag+addflag;
}
if(str[0]=='0')
str=str.substr(1,str.size());
return str;
}
int main()
{
string str1,str2;
while(cin>>str1>>str2)
{
if((str1[0]-'0')==0||(str2[0]-'0')==0)
cout<<0<<endl;
//cout<<str1<<"*"<<str2<<"="<<endl;
else
cout<<BigNumMultiply(str1,str2)<<endl;
}
return 0;
}
3.最后贴上自己的代码
先加减,再进位的操作。
#include<stdio.h>
#include<string>
#include<cstring>
#include<iostream>
#include<assert.h>
#include<cmath>
#include<algorithm>
using namespace std;
string mul(string s1,string s2,int len1,int len2){
//先处理加法问题,再考虑进位问题
string s(len1+len2,'0');
for(int i=len1-1;i>=0;--i){
int adf=0;//加法进位
int muf=0;//乘法进位
for(int j=len2-1;j>=0;--j){
int temp1=(s1[i]-'0')*(s2[j]-'0')+muf;
muf=temp1/10;//进位
temp1=temp1%10;//余数
int temp2=s[i+j+1]-'0'+temp1+adf;//总数加减
adf=temp2/10;
s[i+j+1]=temp2%10+'0';
}
s[i]+=adf+muf;//进位
}
if(s[0]==0)
s=s.substr(1,s.size()) ;
return s;
}
int main(){
string s1,s2;
while(cin>>s1>>s2)
{
int len1=s1.size();
int len2=s2.size();
if((s1[0]-'0'==0)||(s2[0]-'0'==0)){
cout<<0<<endl;
}
else
cout<<mul(s1,s2,len1,len2)<<endl;
}
return 0;
}