题目描述
求两数的积。
输入格式
两行,两个整数。
输出格式
一行一个整数表示乘积。
输入输出样例
输入 #1复制
1
2
输出 #1复制
2
说明/提示
每个数字不超过 10^{2000},需用高精。
答案
#include<stdio.h>
#include<string.h>
int main()
{
char num1[2000];
char num2[2000];
scanf("%s",num1);
scanf("%s",num2);
int n=strlen(num1),m=strlen(num2);//n为num1的位数,m为num2的位数
int a[n],b[m];//定义数组a,b存放num1和num2的每位数字
int i,j;//角标
for (i=0,j=n-1;i<n;i++,j--){
a[i]=num1[j]-'0';//倒序存放num1
}
for (i=0,j=m-1;i<m;i++,j--){
b[i]=num2[j]-'0';//倒序存放num2
}
int c[4000]={0};//c用来存放乘积
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
c[i + j] += a[i] * b[j];//乘法原理(列竖式)
}
}
for (i = 0; i < n + m; i++) {//进位(列竖式很直观)
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
for (j = 3999; j > 0; j--) {//从c数组最后一位开始,找第一个不为0的位
if (c[j] != 0)//找到了就退出循环
break;
}
for (i = j; i >= 0; i--) {//从找到的j开始打印到第一位
printf("%d", c[i]);
}
return 0;
}
注: 关于C数组的长度,实际上是可以找出规律的: 9X9=81 一位数乘以一位数,结果最多为两位数。 99X99=9801 两位数乘以两位数,结果最多为四位数。 99X9=891 两位数乘以一位数,结果最多为3位数。 简单分析发现,结果的位数不超过被乘数和乘数位数之和。 即:c数组的长度为n+m。