蒟蒻橙题高精求助!悬关

P1303 A*B Problem

zhang_feng_rui @ 2023-11-12 12:36:23

P1303

40分

#include<bits/stdc++.h>
using namespace std;
string in_a,in_b;
const int N=4e3+10;
int x[N],y[N],a[N],b[N],c[2*N];
int na,nb,n,m;
bool flag=false;
void in(){
    cin>>in_a>>in_b;
    na=in_a.size();
    nb=in_b.size();
    n=max(na,nb);
    m=na+nb;
}
void change(){
    for(int i=0;i<na;i++)x[i]=(int)in_a[i]-'0';
    for(int i=0;i<nb;i++)y[i]=(int)in_b[i]-'0';
    for(int i=0;i<n;i++)a[i]=x[i-(n-na)];
    for(int i=0;i<n;i++)b[i]=y[i-(n-nb)];
}
void print(){
    for(int i=0;i<n;i++)printf("%d",a[i]);
    cout<<endl;
    for(int i=0;i<n;i++)printf("%d",b[i]);
    cout<<endl;
}
void calc(){
    for(int i=(n-na);i<n;i++)for(int j=(n-nb);j<n;j++)c[i+j]+=a[i]*b[j];
    int tmp=0;
//  for(int i=(n-na)+(n-nb);i<m-1+(n-na)+(n-nb);i++)printf("%d ",c[i]);
//  cout<<endl;
    for(int i=m-1;i>=0;i--){
        int tot=c[i];
        c[i]=(c[i]+tmp)%10;
        tmp=(tot+tmp)/10;
//      printf("tmp=%d\n",tmp);
    }
    if(tmp>0){
        cout<<tmp;
        flag=true;
    }
//  for(int i=(n-na)+(n-nb);i<m-1+(n-na)+(n-nb);i++)printf("%d ",c[i]);
//  cout<<endl;
}
void out(){
    for(int i=0/*(n-na)+(n-nb)*/;i<m-1+(n-na)+(n-nb);i++){
        if(c[i]!=0)flag=true;
        if(flag)printf("%d",c[i]);
    }
}
int main(){
    in();//输入
    change();//转换
//  print();//调试输出
    calc();//计算
    out();//输出
    return 0;
}

自测的小数据都没问题的,大数据就过不了,不知道为啥

能说出蒟蒻错哪里并帮助蒟蒻AC的有关


by Lijunzhuo @ 2023-11-12 12:48:17

在 change 函数中,你通过 for 循环将输入的字符串转换成整数数组,但是在赋值的时候使用了不确定的下标(i-(n-na)),这样可能导致数组越界的问题。正确的赋值应该是 a[i] = x[i - (n - na)] 和 b[i] = y[i - (n - nb)]。 在 out 函数中,你打算从数组 c 的某个位置开始输出结果,但是忽略了下标的范围。如果要输出整个乘积结果,应该从 0 开始直到 m-1+(n-na)+(n-nb)。


by zhang_feng_rui @ 2023-11-12 13:02:37

@Lijunzhuo0075

没太懂

change函数里你这个正确的赋值也没改啊?

out函数里你这个也没改啊?

如果我说错了请大佬指出


by Lijunzhuo @ 2023-11-12 13:22:53

@zhang_feng_rui 第一个点你错的原因是:输出时前导零不应该全去掉,如输入 0 0,输出应为 0


by Lijunzhuo @ 2023-11-12 13:23:44

输出应为 0 不应该什么也不输出。


by Lijunzhuo @ 2023-11-12 13:25:28

可以特判一下:

if(!flag) printf("0\n");

by Lijunzhuo @ 2023-11-12 13:27:52

字符串反转时,你可以使用reverse函数:

reverse(in_a.begin(),in_a.end());
reverse(in_b.begin(),in_b.end());

by Lijunzhuo @ 2023-11-12 13:31:10

你对照一下:

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[125000],b[125000],c[125000];
#define asd int main()
asd
{
    cin>>s1>>s2;
    reverse(s1.begin(),s1.end());
    reverse(s2.begin(),s2.end());
    for(int i=0;i<s1.length();i++) a[i]=s1[i]-'0';
    for(int i=0;i<s2.length();i++) b[i]=s2[i]-'0';
    for(int i=0;i<=s1.length();i++)
        for(int j=0;j<=s2.length();j++)
        {
            c[i+j]+=a[i]*b[j];
            if(c[i+j]>=10)
            {
                c[i+j+1]+=c[i+j]/10;
                c[i+j]%=10;
            }
        }
    int p=0;
    for(int i=s1.length()+s2.length();i>=0;i--)
        if(c[i])
        {
            p=i;
            break;
        }
    for(int i=p;i>=0;i--) printf("%d",c[i]);
    return 0;
}

记录


by Lijunzhuo @ 2023-11-12 13:32:17

@zhang_feng_rui

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[125000],b[125000],c[125000];
#define asd int main()
asd
{
    cin>>s1>>s2;
    reverse(s1.begin(),s1.end());
    reverse(s2.begin(),s2.end());
    for(int i=0;i<s1.length();i++) a[i]=s1[i]-'0';
    for(int i=0;i<s2.length();i++) b[i]=s2[i]-'0';
    for(int i=0;i<=s1.length();i++)
        for(int j=0;j<=s2.length();j++)
        {
            c[i+j]+=a[i]*b[j];
            if(c[i+j]>=10)
            {
                c[i+j+1]+=c[i+j]/10;
                c[i+j]%=10;
            }
        }
    int p=0;
    for(int i=s1.length()+s2.length();i>=0;i--)
        if(c[i])
        {
            p=i;
            break;
        }
    for(int i=p;i>=0;i--) printf("%d",c[i]);
    return 0;
}

by zhang_feng_rui @ 2023-11-12 13:45:58

@Lijunzhuo0075

感谢,过了


by Lijunzhuo @ 2023-11-12 13:46:53

OK


|