高精四则运算及求模运算之高精度乘法
题目描述
求两数的积。
输入格式
两行,两个整数。
输出格式
一行一个整数表示乘积。
输入输出样例
输入
1
2
输出
2
思路:先定义两个字符数组来存储字符串,定义三个整型数组来存储两个乘数和积;然后先对两个乘数的正负进行判断并将符号去掉,接着将两个乘数倒序输入数组中,然后进行乘法运算,注意的是运算过程中有如下规律:c[i+j] = a[i]*b[j] + m + c[i+j],再接着就是对相乘后的积删除前导零,最后倒序输出即可(输出前判断是否需要输出”-”)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e3+4;
char s1[MAXN];
char s2[MAXN];
int a[MAXN];//乘数1
int b[MAXN];//乘数2
int c[MAXN];//积
int main(){
cin>>s1>>s2;
//true表示正数,false表示负数
bool flag1 = true;
if(s1[0]=='-'){
flag1 = false;
strcpy(s1,&s1[1]);
}
bool flag2 = true;
if(s2[0]=='-'){
flag2 = false;
strcpy(s2,&s2[1]);
}
//将两个乘数倒序输入数组中
int len1 = strlen(s1);
for(int i = 0;i < len1;i++){
a[i] = s1[len1-i-1] - '0';
}
int len2 = strlen(s2);
for(int i = 0;i < len2;i++){
b[i] = s2[len2-i-1] - '0';
}
//乘法计算
int m;//进位
for(int i = 0;i < len1;i++){
m = 0;
for(int j = 0;j < len2;j++){
c[i+j] = a[i]*b[j] + m + c[i+j];
m = c[i+j] / 10;
c[i+j] %= 10;
}
c[i+len2] = m;
}
//删除前导零
int len3 = len1 + len2;
for(int i = len3-1;i >= 0;i--){
if(c[i]==0 && len3 > 1)
len3--;
else
break;
}
//打印出积
if((flag1==true && flag2==false) || (flag1==false && flag2==true))
cout<<"-";
for(int i = len3-1;i >= 0;i--)
cout<<c[i];
return 0;
}