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
- 设计思想:
-视频讲解链接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 };
牛客题霸 文章被收录于专栏
本专栏主要是牛客题霸习题的讲解,有详细的考点分类,大家可以可以看看呦!!!