A*B Problem
题目背景
高精度乘法模板题。
题目描述
给出两个非负整数,求它们的乘积。
输入格式
输入共两行,每行一个非负整数。
输出格式
输出一个非负整数表示乘积。
样例 #1
样例输入 #1
1
2
样例输出 #1
2
提示
每个非负整数不超过 1 0 2000 10^{2000} 102000。
题解
//高精乘
#include<bits/stdc++.h>
using namespace std;
const int N = 2500;
char sa[N], sb[N];//两个数
int a[N], b[N], c[2*N]/*结果的数位最大是a和b的两倍*/, lc;
int main(){
scanf("%s%s", sa, sb); //快读
int la = strlen(sa), lb = strlen(sb);//获取长度
for(int i = 0; i < la; i++) a[la-i] = sa[i] - '0'; // 把字符转换成数组
for(int i = 0; i < lb; i++) b[lb-i] = sb[i] - '0'; //+1
for(int i = 1; i <= la; i++){
for(int j = 1; j <= lb; j++){
c[i+j-1] += a[i]*b[j]; //a的每个位和b的每个数位相乘
c[i+j] += c[i+j-1]/10; //下一位加上上一位的进位,c[i-j-1]/10
c[i+j-1] %= 10; // 上一位的等于减掉进位剩下的
}
}
lc = la + lb;
while(!c[lc] && lc > 1) lc--; //删除结果的前导零,并且是大于1的
for(int i = lc; i > 0; i--) printf("%d", c[i]); //反向输出答案
return 0;
}
/*
c[i+j-1]如何得来a*b应该放在c的哪个位:
i j c
1 1 1
2 1 2
1 2 2
2 2 3
3 2 4
i+j - 1
*/