大数乘法
大数乘法
http://www.nowcoder.com/questionTerminal/6b668316f0ac4421ae86d7ead4301b42
题解:
考察点: 模拟,字符串
易错点:
题目中明确说明了是大数的乘法,很显然会是会爆掉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; }