社区讨论
讲解(C++)
P1303A*B Problem参与者 9已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mlkwqxs5
- 此快照首次捕获于
- 2026/02/13 21:12 6 天前
- 此快照最后确认于
- 2026/02/13 21:25 6 天前
这是一道看起来很水的题目,这里我来讲一下具体解法给刚开始学的同胞们。
首先将两个特别大的数字读入字符串,然后倒着放进一维数组 (和高精度加法一样);
CPPcin>>a1>>b1;
int lena=strlen(a1);
int lenb=strlen(b1);
for(i=1;i<=lena;i++)a[i]=a1[lena-i]-'0';
for(i=1;i<=lenb;i++)b[i]=b1[lenb-i]-'0';
接下来,不难想到,在计算乘法的时候可以使用两个循环进行枚举,以上面的图片为例子:外循环i为3489,内循环j为2934。 (你想想自己怎么算乘法的)
数组c作为答案数组,在枚举时令
CPPc[i+j-1]+=a[i] * b[j];
for(i=1;i<=lenb;i++)
for(j=1;j<=lena;j++)
c[i+j-1]+=a[j]*b[i];
在计算乘法的时候先不考虑进位,之后再加上去就行。但是为什么是i+j-1呢,事实上,j是指正常的计算进位(一位一位进行乘法计算),而i就是我们说的错位相加。
在进行枚举计算之后,我们的c数组就成为了没有进位的答案,如下图
之后,我们只需要对c数组进行进位操作就好了。
CPPfor(i=1;i<lena+lenb;i++)//无论数字如何大,数位也不会大于两个乘数的和
if(c[i]>9)//大于9则需要进位
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
最后,我们还需要一个去除数字首多余的0的操作,同加法。
CPPlen=lena+lenb;
while(c[len]==0&&len>1)len--;
最后的最后,我们只需要将数字输出就好了
CPPfor(i=len;i>=1;i--)cout<<c[i];
return 0;//华丽的结束
那么最后附上AC代码
CPP#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char a1[10001],b1[10001];
int a[10001],b[10001],i,x,len,j,c[10001];
int main ()
{
cin>>a1>>b1;//不解释,不懂看前面
int lena=strlen(a1);//每个部分都很清楚
int lenb=strlen(b1);//这只是方便你们复制
for(i=1;i<=lena;i++)a[i]=a1[lena-i]-'0';
for(i=1;i<=lenb;i++)b[i]=b1[lenb-i]-'0';
for(i=1;i<=lenb;i++)
for(j=1;j<=lena;j++)
c[i+j-1]+=a[j]*b[i];
for(i=1;i<lena+lenb;i++)
if(c[i]>9)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
len=lena+lenb;
while(c[len]==0&&len>1)len--;
for(i=len;i>=1;i--)cout<<c[i];
return 0;
}
(帮忙交一下)
回复
共 11 条回复,欢迎继续交流。
正在加载回复...