题目描述
求两数的积。
输入格式
两行,两个整数。
输出格式
一行一个整数表示乘积。
输入输出样例
输入
1
2
输出
2
说明/提示
每个数字不超过 10^2000,需用高精。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
void Mul(char a[],char b[])
{
int x[10005],y[10005],sum[10005];//分别用来存大数a,大数b,以及二者的成绩
memset(x,0,sizeof(x));//初始化数组
memset(y,0,sizeof(y));
memset(sum,0,sizeof(sum));
for(int i=0;i<strlen(a);i++)//把字符串a,倒过来转变成int型数组x(因为输入时高位在前,而计算时应从x[0]开始,且x[0]应该为最低位)
x[strlen(a)-1-i] = a[i] - '0';
for(int i=0;i<strlen(b);i++)//同理把字符串b,倒过来转变成int型数组y
y[strlen(b)-1-i] = b[i] - '0';
int c = strlen(a)+strlen(b);//二者的乘积长度不会超过二者之和
for(int i=0;i<strlen(a);i++)
{
for(int j=0;j<strlen(b);j++)
{
sum[i+j] += x[i]*y[j];//分析出x[i]与y[j]的乘积应放于sum[i+j]处
if(sum[i+j]>=10)//如果该位置(sum[i+j])的乘积大于等于10,就把它的十位给sum[i+j+1],个位给sum[i+j]
{
sum[i+j+1] += sum[i+j]/10;//任何一个位置的sum都不可能大于9
sum[i+j] %=10;
}
}
}
while(sum[c]==0)//把成绩前面的0去掉,(防止出现123*32=03936类似情况)
{
if(c==0)break;//防止结果为0时,一直c--导致没有输出的情况(例如123*0无结果的情况)
c--;
}
for(int i=c;i>=0;i--)//输出结果
printf("%d",sum[i]);
}
int main()
{
char a[10005],b[10005];
scanf("%s%s",a,b);//输入两个大数
Mul(a,b);
system("pause");
return 0;
}