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 第一个点你错的原因是:输出时前导零不应该全去掉,如输入
by Lijunzhuo @ 2023-11-12 13:23:44
输出应为
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