题目描述
给出两个整数,求它们的乘积。
输入格式
输入共两行,每行一个整数。
输出格式
输出一个整数表示乘积。
输入输出样例
输入
1 2
输出
2
说明/提示
每个整数的绝对值不超过 10^{2000}。
解题思路:
首先,我们先判断输入的数是否为负数,若为负数则先用substr()去掉负号,同时用一个变量记录下来;接着,因为数据可能太大,所以输入只能用字符串,我们需要把字符串的每一位倒序存进整型数组,倒序是为了方便计算;下一步,我们要将两个数组中的每一位依次相乘,都相乘完之后再进位;然后,去掉末尾没用的0,最后,判断结果是否为负数,是则先输出负号再输出结果,否则直接输出结果。
计算的公式s[i+j]+=c[i]*d[j],i,j 代表的是第几位(从0位开始算起)
举个例子 253 * 167
位数 4 3 2 1 0
d 1 6 7
c 2 5 3
s 3 18 21 //这一行是c[0]*d[j]
5 30 35 //这一行是c[1]*d[j]
2 12 14 //这一行是c[2]*d[j]
进位算和 4 2 2 5 1
代码:
#include<bits/stdc++.h>
using namespace std;
int s[50001]= {0},c[50001],d[50001];
int main() {
string a,b;
cin>>a>>b;
int l1,l2,i,j,m=1,n=1;
l1=a.length();
l2=b.length();
if(a[0]=='-') { //去掉负号并做记录
m=-1;
a=a.substr(1,l1-1);
l1--;
}
if(b[0]=='-') { //去掉负号并做记录
n=-1;
b=b.substr(1,l2-1);
l2--;
}
for(i=l1-1,j=0; i>=0; i--) //将a到存进c数组中
c[j++]=a[i]-'0';
for(i=l2-1,j=0; i>=0; i--) // 将b到存进d数组中
d[j++]=b[i]-'0';
for(i=0; i<l1; i++) //c的每一位依次乘以d的每一位
for(j=0; j<l2; j++)
s[i+j]+=c[i]*d[j];
for(i=0; i<l1+l2; i++) // 从头到尾依次进位
if(s[i]>9) {
s[i+1]+=s[i]/10;
s[i]%=10;
}
while(!s[i]&i>0) i--;//去掉后面多余的0
if(m*n<0&&c[0]!=0&&d[0]!=0) cout<<"-"; //判断结果是否是负数
for(i; i>=0; i--)
cout<<s[i];
return 0;
}