123456789qaz @ 2022-05-27 16:23:27
#include<iostream>
#include<math.h>
#include<cstring>
using namespace std;
int a[4000];
int b[4000];
int c[8000];
int ak,bk;
string ain;
string bin;
void cheng(){
//cout<<ak<<endl<<bk<<endl;
for(int i=0;i<ak;i++){
for(int j=0;j<bk;j++){
c[i+j]+=a[i]*b[j];
//cout<<i<<' '<<j<<' '<<c[i+j]<<endl;
}
}
return ;
}
void up(){
for(int i=0;i<ak+bk+1;i++){
c[i]=c[i]%10;
c[i+1]+=c[i]/10;
}
}
void out(){
bool is0=true;
for(int i=ak+bk+1;i>=0;i--){
if(is0){
if(c[i]!=0){
cout<<c[i];
is0=false;
}
}
else{
cout<<c[i];
}
}
}
void in(){
cin>>ain>>bin;
ak=ain.length();
bk=bin.length();
for(int i=0;i<ak;i++){
a[i]=ain[ak-i-1]-'0';
}
for(int i=0;i<bk;i++){
b[i]=bin[bk-i-1]-'0';
}
}
int main(){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
//cout<<"请输入两个乘数"<<endl;
in();
if(ain=="0" || bin=="0"){
cout<<'0';
return 0;
}
//cout<<"solve in"<<endl;
//for(int i=0;i<ak;i++){
//cout<<a[i];
//}
//cout<<endl;
//for(int i=0;i<bk;i++){
//cout<<b[i];
//}
//cout<<endl;
cheng();
//cout<<endl<<"solve multiplication"<<endl;
up();
//cout<<"solve up"<<endl;
//cout<<"OK! Answer is:";
out();
//cout<<endl<<"Thank for using!"<<endl;
return 0;
}
by Terrible @ 2022-05-27 18:10:13
@123456789qaz
你这个进位的时候不对,顺序错了,是先进位,再对本位取余。即c[i+1]+=c[i]/10;c[i]=c[i]%10;
。
你如果用不太可能造成进位的数据去测试的话,那么它几乎是对的。
你可以在你原本的程序中试试
by 123456789qaz @ 2022-05-28 10:24:07
@Terrible
刚刚尝试了一下,AC了,是因为先求余导致c[i]发生变化导致错误吗?在此万分感谢大佬!