- 设计思想:
-视频讲解链接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
};
京公网安备 11010502036488号