题目描述
给出两个非负整数,求它们的乘积。
输入格式
输入共两行,每行一个非负整数。
输出格式
输出一个非负整数表示乘积。
输入输出样例
输入
1 2
输出
2
说明/提示
每个非负整数不超过 10^2000
思路都写在代码里了。。。
直接上代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5;
char a[N], b[N];
int k, arr[N], len;
string str[N], s;
void init()
{
//初始化,第i行字符串前面就有i个0,如下面123*111,
//我们倒叙插入,所以第一行是321,第二行就是0321,第三行就是00321
/*
* 123
* 111
*
= 123
1230
12300
*/
for (int i = 0; i < 10000; i++)
{
int j = i;
while (j--)
str[i] += 0 + '0';
}
}
int main()
{
init();
cin >> a >> b;
int lena = strlen(a);
int lenb = strlen(b);
for (int i = lenb - 1; i >= 0; i--)
{
int c = 0;
for (int j = lena - 1; j >= 0; j--)
{
int p1 = b[i] - '0';
int p2 = a[j] - '0';
c = p1 * p2 + c; //根据乘法计算,我们从第二行的个位数开始,一次乘上第一行的每一位数,如123*123就是先1*123,再2*123...
int u = c % 10; //算了不想注释了,就是小学乘法的计算方法
str[k] += u % 10 + '0'; //储存第二行每位数乘上第一行的计算结果,因为初始化已经补0,直接拼接就行
/*
如 123
* 111
-----
123
1230
12300
那么第一行就是存储 321
第二行就是存储 0321
第三行就是存储 00321
写到这里就会发现,我们现在只需要把每一项相加就可以再反向输出就可以了
*/
c /= 10; //最后别忘了进位
}
while (c) //如果最后c还是大于0,接着进位
{
str[k] += c + '0';
c /= 10;
}
int w = i - 1;
k++;
}
//开始计算每一行相加的结果
for (int i = 0; i < k; i++)
{
int c = 0;
for (int j = 0;str[i][j]; j++)
{
int p1 = str[i][j] - '0';
int c = arr[j] + p1;
arr[j] = c % 10;
c /= 10;
arr[j + 1] += c;
len = max(len, j + 1); //计算最后长度,因为不确定最后一次相加有没有进位,我们统一当作进位的长度,输出的时候再进行特判
}
}
//反向输出
bool flag = true;
for (int i = len-1; i >= 0; i--)
{
if (arr[len - 1] == 0&&flag)
{
flag = false;
continue;
}
cout << arr[i];
}
cout << endl;
return 0;
}
算法小白的刷题日记。