NC10 大数乘法(4种语言代码+视频讲解)

大数乘法

https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId=196&&tqId=37177&rp=1&ru=/ta/job-code-total&qru=/ta/job-code-total/question-ranking

- 题目描述:
图片说明
- 题目链接:
https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId=196&&tqId=37177&rp=1&ru=/ta/job-code-total&qru=/ta/job-code-total/question-ranking

- 设计思想:


图片说明

-视频讲解链接B站视频讲解
- 复杂度分析:
图片说明
- 代码:
c++版本:

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <iterator>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        // write code here
        int len_i = s.size()- 1;
        int len_j = t.size() -1;
        if(len_i < len_j) swap(s,t),swap(len_i,len_j);///如果字符串s的长度比字符串t的长度小就交换
        // 最后相乘的结果,长度最多就是 2 个字符串的长度相加
        vector<int> ve(len_i + len_j + 2,0);
        for(int i = len_i;i >= 0;i --){///number1的每一位
            for(int j = len_j;j >= 0;j --){//number2的每一位
                ///每一位相乘的结果放在对应的number数组里面
                ve[i + j + 1] += (s[i] - '0') * (t[j] - '0');
            }
        }
        int temp = 0;///用来就当前这一位相乘的结果
        int carry = 0;//代表进位
       vector<char> res;
        for(int i = ve.size()-1;i >= 1;i --){
            temp = ve[i] + carry;
            res.push_back((temp % 10 + 48));
            carry = temp /10;
        }
        if(carry != 0){
            res.push_back(carry + 48);
        }
        string str;
        reverse(res.begin(),res.end());
        return str.assign(res.begin(), res.end());

    }
};

Java版本:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        int len_i = s.length()- 1;//字符串s的长度
        int len_j = t.length() -1;//字符串t的长度
        //确保被乘数
        if(len_i < len_j) {
            //如果字符串s的长度比字符串t的长度小就交换
            String temp1 = s;
            s = t;
            t = temp1;

            int temp = len_i;
            len_i = len_j;
            len_j = temp;
        }
        //最后相乘的结果,长度最多就是2个字符串的长度相加
       int[] ve = new int[len_i + len_j + 2];;
        for(int i = len_i;i >= 0;i --){///number1的每一位
            for(int j = len_j;j >= 0;j --){//number2的每一位
                ///每一位相乘的结果放在对应的number数组里面
                ve[i + j + 1] += (s.charAt(i) - '0') * (t.charAt(j) - '0');
            }
        }
        int temp = 0;///用来统计当前这一位获得的乘法
        int carry = 0;//代表进位
        StringBuilder res = new StringBuilder();
        for(int i = ve.length-1;i >= 1;i --){
            //将乘积结果放在对应的位置
            temp = ve[i] + carry;
            res.append(temp % 10);
            carry = temp /10;
        }
        //如果最后有进位,仍然需要放进去
        if(carry != 0){
            res.append(carry);
        }
        //将结果逆序即为最终答案
        return res.reverse().toString();
    }
}

Python版本:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# 
# @param s string字符串 第一个整数
# @param t string字符串 第二个整数
# @return string字符串
#
class Solution:
    def solve(self , s , t ):
        # write code here

        if len(s) < len(t):
            s,t = t,s
        len_i = len(s) - 1
        len_j = len(t) - 1
        ve = [0] * (len_i + len_j + 2)
        for i in range(len_i,-1,-1):#number1的每一位
            for j in range(len_j,-1,-1):#number2的每一位
                #每一位相乘的结果放在对应的number数组里面
                ve[i + j + 1] += (ord(s[i]) - 48) * (ord(t[j]) - 48);
        temp = 0#用来就当前这一位相乘的结果
        carry = 0#代表进位
        res = []
        for i in range(len(ve) - 1,0,-1):
            temp = ve[i] + carry
            res.append(str(temp % 10))
            carry = temp // 10

        if carry:
            res.append(str(carry))
        res.reverse()
        return ''.join(res)

JavaScript版本:

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param s string字符串 第一个整数
 * @param t string字符串 第二个整数
 * @return string字符串
 */
function solve( s ,  t ) {
    // write code here
            // write code here
        let len_i = s.length- 1;//字符串s的长度
        let len_j = t.length -1;//字符串t的长度
        //确保被乘数
        if(len_i < len_j) {
            //如果字符串s的长度比字符串t的长度小就交换
            let temp1 = s;
            s = t;
            t = temp1;

            let temp = len_i;
            len_i = len_j;
            len_j = temp;
        }
        //最后相乘的结果,长度最多就是2个字符串的长度相加
    let ve = new Array(len_i + len_j + 2).fill(0);
        for(let i = len_i;i >= 0;i --){///number1的每一位
            for(let j = len_j;j >= 0;j --){//number2的每一位
                ///每一位相乘的结果放在对应的number数组里面
                ve[i + j + 1] += parseInt(s[i]) * parseInt(t[j]);
            }
        }
        let temp = 0;///用来统计当前这一位获得的乘法
        let carry = 0;//代表进位
        let res = [];
        for(let i = ve.length-1;i >= 1;i --){
            //将乘积结果放在对应的位置
            temp = ve[i] + carry;
            res.push(temp % 10);
            carry = parseInt(temp /10);
        }
        //如果最后有进位,仍然需要放进去
        if(carry != 0){
            res.push(carry);
        }
        //将结果逆序即为最终答案
        return res.reverse().join('');;
}
module.exports = {
    solve : solve
};
牛客题霸 文章被收录于专栏

本专栏主要是牛客题霸习题的讲解,有详细的考点分类,大家可以可以看看呦!!!

全部评论

相关推荐

牛客339922477号:都不用reverse,直接-1。一行。啥送分题
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务