大数乘法

大数乘法

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;
}
全部评论

相关推荐

4 1 评论
分享
牛客网
牛客企业服务