描述
求两个不超过200位的非负整数的积。
输入 有两行,每行是一个不超过200位的非负整数,没有多余的前导0。 输出
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
解:
由题,输入200位的非负整数是无法用整形储存的,因此只能用字符串输入,再将其转换为数组形式运算并输出。
先定义两个字符串m、n,通过字符串输入,再定义两个整形数组a、b,通过循环将mn倒置并减去‘0’化为整数,放入ab中。然后定义c数组来存放计算结果,并使每一位初始值为0。接下来就是两数相乘的过程。先写出两重循环,模拟竖式,循环变量分别表示ab所计算到的位置,再专门定义s 表示结果存放在c的那一位。由于进位的问题,一定要在计算c[s]时加上其本身,并只保留个位,因此c[s]=(c[s]+a[i]*b[j])%10,c的后一位则变为其本身加上c[s]的十位(由于这是乘法,因此每一位可能循环计算很多次,必须注意加上其本身)。还需注意,当a[i]乘完整个b数组后,s又得退回,但根据竖式,每乘完一次b,s退回的值都-1。最后,由于方便,之前的计算是让c从0开始计数的,因此需找到最后一位字符,并倒着输出。
参考代码:
#include<math.h>
#include<cstdio>
#include<cstdlib>
#include<cstring>
int main()
{
char m[200],n[200];
int a[200],b[200];
scanf("%s %s",m,n);
if(m[0]=='0'||n[0]=='0')
{
printf("0");
return 0;
}
for(int i=0;i<strlen(m);i++)
{
a[i]=m[strlen(m)-1-i]-'0';
}
for(int i=0;i<strlen(n);i++)
{
b[i]=n[strlen(n)-1-i]-'0';
}
/*for(int i=0;i<strlen(n);i++)
{
printf("%d",b[i]);
}
printf("\n");*/
int c[40000];
for(int i=0;i<40000;i++)
{
c[i]=0;
}
int s=0;
int t=0;
for(int i=0;i<strlen(m);i++)
{
for(int j=0;j<strlen(n);j++)
{
c[s]=c[s]+a[i]*b[j];
c[s+1]=c[s+1]+c[s]/10;
c[s]=c[s]%10;
s++;
}
t++;
s=t;
}
s=strlen(m)+strlen(n);
while(c[s]==0)
{
s--;
}
for(int i=s;i>=0;i--)
{
printf("%d",c[i]);
}
}