牛客题解 | 大数乘法

题目

题目链接

题解:

考察点: 模拟,字符串

易错点:

题目中明确说明了是大数的乘法,很显然会是会爆掉int或者long long类型的,所以切不可用这2种类型来记录数据,进行简单的乘法

方法一:Python

因为\(Python\)语言支持自动高精度,因此本题如果用\(Python\)来写就会显得尤为简单。需要注意的是\(Python\)的输入是字符串,所以需要自己转化为对应的类型;\(strip\)去掉左右两端的空白符,返回\(str\)\(split\)把字符串按空白符拆开,返回\(str\)\(map\)\(list\)里面的值映射到指定类型,返回\(type\)

m,n = map(int, input().split())
print(m * n)

方法二:高精度

\(Python\)语言支持自动高精度,\(Java\)语言有大数类,而C++语言中却不存在这种东西。但C++语言同样可以解决上述问题,这就需要引入一个概念,高精度。所谓高精度,就是把大整数当成字符串输入,然后通过模拟小学数学中竖式计算加减乘除的方法来计算出结果。本题中要求的高精度乘法,因此通过模拟竖式中的乘法来解决此类问题。将被乘数中的第\(i\)位和乘数中的第\(j\)位相乘,所得结果的个位位于\(i+j+1\)中,所产生的进位作用于\(i+j\)位中。基于这个思路,可以对字符串模拟写出如下代码:

#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&gt;=0;i--){
        int n1=s1[i]-'0';
        for(int j=s2.length()-1;j&gt;=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&amp;&amp;res[i]==0)" continue; str+="res[i]+'0';" } return str; int main() { string s1,s2; cin>&gt;s1&gt;&gt;s2;
    cout&lt;</res.size();i++){></int>
posted @ 2025-03-04 11:47  wangxiaoxiao  阅读(10)  评论(0)    收藏  举报