2980:大整数乘法
原题:http://bailian.openjudge.cn/practice/2980/
描述
求两个不超过200位的非负整数的积。
输入
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
12345678900 98765432100
样例输出
1219326311126352690000
解法
思路:小学数学乘法,一项一项的乘,省却了中间结果,直接加起来
坑:如果只写这一个的话,前导0以及8*0这种特殊样例
#include <iostream> #include <cstring> using namespace std; int factora[200] = {}; int factorb[200] = {}; int sum[500] = {}; int cnt1, cnt2; int mul() { int* maxn; int* minn; int maxlen, minlen; if (cnt1 < cnt2) { maxn = factorb; minn = factora; maxlen = cnt2; minlen = cnt1; } else { maxn = factora; minn = factorb; maxlen = cnt1; minlen = cnt2; } for (int i = 0; i < minlen; i++){ for (int j = 0; j < maxlen; j++) { int temp = minn[i] * maxn[j] + sum[i + j]; sum[i + j + 1] += temp / 10; sum[i + j] = temp % 10; } } for (int j = minlen + maxlen + 2; j >= 0; j--) if (sum[j] != 0) return j; return 0; } int main() { memset(sum, 0, sizeof(sum)); cnt1 = 0; cnt2 = 0; char inputa[200]; char inputb[200]; cin >> inputa; cin >> inputb; cnt1 = strlen(inputa); cnt2 = strlen(inputb); for (int i = 0; i < cnt1; i++) factora[cnt1 - 1 - i] = inputa[i] - '0'; for (int i = 0; i < cnt2; i++) factorb[cnt2 - 1 - i] = inputb[i] - '0'; int result = mul(); for (int j = result; j >= 0; j--) cout << sum[j]; return 0; }