校招算法笔面试 | 校招笔面试真题-大数乘法

校招大数乘法算法笔面试题解

题目

题目链接

题解:

考察点: 模拟,字符串

易错点:

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

方法一:Python

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

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

方法二:高精度

P y t h o n Python Python语言支持自动高精度, J a v a Java Java语言有大数类,而C++语言中却不存在这种东西。但C++语言同样可以解决上述问题,这就需要引入一个概念,高精度。所谓高精度,就是把大整数当成字符串输入,然后通过模拟小学数学中竖式计算加减乘除的方法来计算出结果。本题中要求的高精度乘法,因此通过模拟竖式中的乘法来解决此类问题。将被乘数中的第 i i i位和乘数中的第 j j j位相乘,所得结果的个位位于 i + j + 1 i+j+1 i+j+1中,所产生的进位作用于 i + j i+j 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>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值