题目描述
给出两个非负整数,求它们的乘积。
输入格式
输入共两行,每行一个非负整数。
输出格式
输出一个非负整数表示乘积。
样例 #1
样例输入 #1
1
2
样例输出 #1
2
提示
每个非负整数不超过 1 0 2000 10^{2000} 102000。
解析
一、主要思路
参考博客:
跳转链接,来源洛谷
主要思路如下:进行乘法的思路参考手动运算乘法的过程。
- 输入两个大数字,用字符串存贮。
- 将两个字符串翻转,这里是为了方便模拟乘法中从最后一位开始的运算过程。
- 对结果数组进行定义,当一个是n位数,一个是m位数,由于结果数组不会超过n+m位,直接假设结果位n+m位。
- 对结果数组进行处理(对应图中第一次处理结果):
for(int i = 0; i < b_len; i ++){
for(int j = 0; j < a_len; j ++){
c[i+j]+=bg[i]*ag[j];
}
}
- 对最终结果进行处理(对应图中最终结果):
for(int i = 0; i < c_len; i++){
c[i+1]+=c[i]/10;
c[i]=c[i] % 10;
}
6. 对输出结果进行处理,当1X1时,这个程序会输出01,则判断得到第一个不为0的数字再输出,这里设置了标志位flag。
int flag = 0;
for(int i=c_len-1; i>=0; i --){
if(c[i] != 0){
flag = 1;
}
if(flag == 1){
cout << c[i];
}
}
if(flag == 0){
cout << 0;
}
二、代码
完整代码如下:
#include <iostream>
using namespace std;
void getResult(string a, string b){
int a_len = a.length();
int b_len = b.length();
int ag[a_len+5];
int bg[b_len+5];
//得到a, b的数组
for(int i = 0; i < a_len; i ++){
ag[i] = a[a_len-i-1] - '0';
}
for(int i = 0; i < b_len; i ++)
bg[i] = b[b_len-i-1] - '0';
//c的数组定义与初始化
int c_len = a_len + b_len;
int c[c_len+5];
for(int i = 0; i < c_len; i ++){
c[i] = 0;
}
//处理c数组
for(int i = 0; i < b_len; i ++){
for(int j = 0; j < a_len; j ++){
c[i+j]+=bg[j]*ag[i];
}
}
for(int i = 0; i < c_len; i++){
c[i+1]+=c[i]/10;
c[i]=c[i] % 10;
}
//输出结果
int flag = 0;
for(int i=c_len-1; i>=0; i --){
if(c[i] != 0){
flag = 1;
}
if(flag == 1){
cout << c[i];
}
}
if(flag == 0){
cout << 0;
}
}
int main(){
string a, b;
cin >> a >> b;
getResult(a, b);
}
三、注意点
- 注意处理当输入含0的情况。
- 对结果的位数进行灵活处理:
当一个是n位数,一个是m位数,两数相乘的时候,结果至少为max(n, m)位,至多位n+m位。 - 处理c数组的时候,循环内层外层可调换。