问题描述
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
计算机真是最傻的东西;他都不能计算大于10^65-1的a*b,请你帮这个“最傻”的东西过关,否则它就真的只认识1和0了。
输入格式
共两行;
第一行输入一个整数a;
第一行输入一个整数b。
输出格式
共一行,一个表示a*b的整数。
输入样例
2147483647
2147483647
输出样例
4611686014132420609
解题思路
1、简单的举一个例子,如3456*12:
只要使用模拟法,将数字a与b的每一位数字相乘,并按位相加即可。且为了方便模拟,将数字倒序存储并计算。
2、当输入任意数字为0时,结果一定为0。
解题代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string a_,b_;
cin>>a_>>b_;
//输入含0时,答案一定为0
if(a_=="0"||b_=="0")
{
cout<<"0";
return 0;
}
int a[a_.length()]={0};
int b[b_.length()]={0};
int ans[1004]={0};
int k1=0,k2=0,m=0,temp=0,carry=0;
//逆序存储
for(int i=a_.length()-1;i>=0;i--)
a[k1++]=a_[i]-'0';
for(int i=b_.length()-1;i>=0;i--)
b[k2++]=b_[i]-'0';
for(int i=0;i<k1;i++)
{
m=i;//为了方便按位相加,设置从第i位开始相加
carry=0;
for(int j=0;j<k2;j++)
{
temp=a[i]*b[j]+carry;
ans[m++]+=temp%10;
carry=temp/10;
}
if(carry) ans[m++]+=carry;
}
//进位
int i=0;
for(i=0;i<m;i++)
{
if(ans[i]>9)
{
ans[i+1]+=ans[i]/10;
ans[i]=ans[i]%10;
}
}
//当存在进位时,位数加1
if(ans[m]!=0) m++;
for(i=m-1;i>=0;i--)
cout<<ans[i];
return 0;
}