40分求助!

P1303 A*B Problem

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 有两个问题:

  1. 数组开小了

每个数字不超过 10^{2000}

  1. 没有考虑到零和非零相乘的情况

修改后 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


|