conprour @ 2021-01-16 07:38:53
一直找不到错误,求大佬帮忙康康orz
#include<bits/stdc++.h>
using namespace std;
char n[105],m[105];
int a[1000],b[1000],c,ans[1000];
int main()
{
scanf("%s%s",n+1,m+1);
int ln=strlen(n+1),lm=strlen(m+1);
for(int i=1;i<=ln;i++)
a[i]=n[ln-i+1]-'0';
for(int i=1;i<=lm;i++)
b[i]=m[lm-i+1]-'0';
int len1=min(ln,lm),len2=max(ln,lm);
if(ln>lm)
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
ans[i+j-1]+=a[j]*b[i]+c;
c=ans[i+j-1]/10;
ans[i+j-1]%=10;
}
ans[i+len2]+=c;
c=0;
// memset(c,0,sizeof(c));
// if(c!=0) ans[i+len2]=c,c=0;
}
else
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
ans[i+j-1]+=a[i]*b[j]+c;
c=ans[i+j-1]/10;
ans[i+j-1]%=10;
}
ans[i+len2]+=c;
c=0;
// if(c!=0) ans[i+len2]=c,c=0;
//memset(c,0,sizeof(c));
}
if(ans[ln+lm]!=0) ln++;
for(int i=ln+lm-1;i>=1;i--)
printf("%d",ans[i]);
return 0;
}
by 老子是北瓜 @ 2021-01-16 07:51:15
首先,您是不是没考虑到0*0的情况
by wsyhb @ 2021-01-16 08:25:09
@conprour 有两个问题:
每个数字不超过
10^{2000}
修改后 AC 代码如下:
#include<bits/stdc++.h>
using namespace std;
char n[2005],m[2005];
int a[2005],b[2005],c,ans[4005];//数组开小了
int main()
{
scanf("%s%s",n+1,m+1);
int ln=strlen(n+1),lm=strlen(m+1);
for(int i=1;i<=ln;i++)
a[i]=n[ln-i+1]-'0';
for(int i=1;i<=lm;i++)
b[i]=m[lm-i+1]-'0';
int len1=min(ln,lm),len2=max(ln,lm);
if(ln>lm)
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
ans[i+j-1]+=a[j]*b[i]+c;
c=ans[i+j-1]/10;
ans[i+j-1]%=10;
}
ans[i+len2]+=c;
c=0;
// memset(c,0,sizeof(c));
// if(c!=0) ans[i+len2]=c,c=0;
}
else
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
ans[i+j-1]+=a[i]*b[j]+c;
c=ans[i+j-1]/10;
ans[i+j-1]%=10;
}
ans[i+len2]+=c;
c=0;
// if(c!=0) ans[i+len2]=c,c=0;
//memset(c,0,sizeof(c));
}
if(ans[ln+lm]!=0) ln++;
bool flag=true;//标记当前是否为前导零
for(int i=ln+lm-1;i>=1;i--)
{
if(ans[i]==0)
{
if(!flag||i==1)//注意可能为 0,因此最后一位必须输出
printf("%d",ans[i]);
}
else
{
flag=false;
printf("%d",ans[i]);
}
}
return 0;
}
by conprour @ 2021-01-16 13:23:59
@老子是北瓜 谢谢!
by conprour @ 2021-01-16 13:24:30
@wsyhb 谢谢DL!qwq