本文主要是介绍洛谷:P1303 A*B Problem(高精度乘法-模拟、字符串),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
给出两个非负整数,求它们的乘积。
输入格式
输入共两行,每行一个非负整数。
输出格式
输出一个非负整数表示乘积。
输入输出样例
输入
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* = 123123012300*/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-----123123012300那么第一行就是存储 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;
}
算法小白的刷题日记。
这篇关于洛谷:P1303 A*B Problem(高精度乘法-模拟、字符串)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!