题解:
考察点: 模拟,字符串
易错点:
题目中明确说明了是大数的乘法,很显然会是会爆掉int或者long long类型的,所以切不可用这2种类型来记录数据,进行简单的乘法
方法一:Python
因为语言支持自动高精度,因此本题如果用
来写就会显得尤为简单。需要注意的是
的输入是字符串,所以需要自己转化为对应的类型;
去掉左右两端的空白符,返回
;
把字符串按空白符拆开,返回
;
把
里面的值映射到指定类型,返回
m,n = map(int, input().split()) print(m * n)
方法二:高精度
语言支持自动高精度,
语言有大数类,而C++语言中却不存在这种东西。但C++语言同样可以解决上述问题,这就需要引入一个概念,高精度。所谓高精度,就是把大整数当成字符串输入,然后通过模拟小学数学中竖式计算加减乘除的方法来计算出结果。本题中要求的高精度乘法,因此通过模拟竖式中的乘法来解决此类问题。将被乘数中的第
位和乘数中的第
位相乘,所得结果的个位位于
中,所产生的进位作用于
位中。基于这个思路,可以对字符串模拟写出如下代码:
#include "bits/stdc++.h"
using namespace std;
const int maxn=20000+10;
string multiply(string s1,string s2){
if(s1=="0"||s2=="0") return "0";
vector<int>res(s1.length()+s2.length());
for(int i=s1.length()-1;i>=0;i--){
int n1=s1[i]-'0';
for(int j=s2.length()-1;j>=0;j--){
int n2=s2[j]-'0';
int sum=res[i+j+1]+(n1*n2);
res[i + j + 1]=sum % 10;
res[i + j]+=sum/10;
}
}
string str="";
for(int i=0;i<res.size();i++){
if(i==0&&res[i]==0) continue;
str+=res[i]+'0';
}
return str;
}
int main()
{
string s1,s2;
cin>>s1>>s2;
cout<<multiply(s1,s2)<<endl;
return 0;
} 
京公网安备 11010502036488号