/*
大数的乘法也是在模仿竖式计算
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#define MAXN 3600//大数乘法要确保给定的长度是两个数最大长度的两倍以上,我比较喜欢36就写了这个
int num1[MAXN], num2[MAXN], number[MAXN];
using namespace std;
string s1, s2;
int main(void)
{
cin >> s1 >> s2;
int len1 = 0;
int len2 = 0;
for (int i = s1.length() - 1; i >= 0; i--)
num1[len1++] = s1[i] - '0';
for (int i = s2.length() - 1; i >= 0; i--)
num2[len2++] = s2[i] - '0';
//把字符转化为数字,个位数在num1[0]和num2[0]
if (len1 > len2)
{//和竖式计算一样,较长的数字放在上面算,较短的放在下面算
for (int i = 0; i < len2; i++)
{//用较短的数字一个个的乘较长的数
for (int j = 0; j < len1; j++)
{//每一位数都会把较长的每一个数字乘一遍
number[i + j] += num1[j] * num2[i];//这里的i+j是下面数字的每一位所对应的分别为1,10,100所以进位也不同
if (number[i + j] >= 10)
{//该位超过10就进位
number[i + j + 1] += number[i + j] / 10;//和大数的加法不同,这里不仅仅只会进一位
number[i + j] %= 10;
}
}
}
}
else
{//和上面差不多,只是表示第二个数字较长或者两数相等的情况
for (int i = 0; i < len1; i++)
{
for (int j = 0; j < len2; j++)
{
number[i + j] += num1[i] * num2[j];
if (number[i + j] >= 10)
{
number[i + j + 1] += number[i + j] / 10;
number[i + j] %= 10;
}
}
}
}
int start = MAXN - 1;
for (; !number[start]; start--);
for (int i = start; i >= 0; i--)
printf("%d", number[i]);
//system("pause");
return 0;
}
51NOD-1027 大数乘法
最新推荐文章于 2022-11-03 18:10:26 发布