LeetCode43. 字符串相乘(大数相乘)

2024-04-28 20:18

本文主要是介绍LeetCode43. 字符串相乘(大数相乘),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = “2”, num2 = “3”
输出: “6”

示例 2:

输入: num1 = “123”, num2 = “456”
输出: “56088”

说明:

num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings

乘法计算

首先我们得先了解一下竖式的计算过程:

​ 我们应该从后往前计算,一个数的第i位乘上另一个数的第j位,就应加在积的第i+j-1位上,“过了10 ”则要向上面进位就行了,该数只需保留该数mod10后的一位数字,如:

在这里插入图片描述

​ 如上图中的738是由数字123乘以数字456 的最后一位数6得来,3 * 6 = 18,所以保留8,进位1;2 * 6 = 12,加上前一位的进位1,最终等于13,所以应该保留3,进位1; 最后的1 * 6 = 6,加上上一位的进位1后,最终等于7,座椅最终结果为738。其他位上的数也是进行一样的计算,最后相同位数上的数字相加得出最终的结果。

​ 由上图可以看到,123 * 6 的结果 738 的最后一位应与 6 对其,123 * 5 的结果 615 的最后一位应与 5 对齐,同理 492 的最后一位应与 4 对齐,下面代码中使用变量 ind 来记录当前数字对齐的位数。

代码实现

/*** @param {string} num1* @param {string} num2* @return {string}*/
var multiply = function(num1, num2) {//其中一个数字为零时,乘积为0,直接返回0if(num1 == '0' || num2 == '0') return '0';var res = [],   // res->保存结果flag = 0,	//flag->保存进位ind = 0;	//ind->当前数字对齐的位数//遍历第一个数的每一位for(let i = num1.length - 1; i >= 0; i--){//遍历第二个数的每一位for(let j = num2.length - 1; j >= 0; j--){//保存计算结果let temp = parseInt(num1[i]) * parseInt(num2[j]) + flag;//注意加上flag(进位)flag = Math.floor(temp / 10);//更新进位数//如果当前计算位置大于res的长度,直接将结果push(接到最后一位),注意应该mod 10//因为乘法是倒序计算的,所以位置应该为 num2.length - 1 - j + indif((num2.length - 1 - j + ind) >= res.length) res.push(parseInt(temp) % 10);else{//计算结果应该加上该位置上的数if((res[num2.length - 1 - j + ind] + (parseInt(temp) % 10)) > 9) flag++;res[num2.length - 1 - j + ind] = (res[num2.length - 1 - j + ind] + (parseInt(temp) % 10)) % 10;}}if(flag) res[ind + num2.length] = flag;flag = 0;//更新初始位ind++;}//reverse()将列表反置,join('')将列表转换成字符串return res.reverse().join('');
};

这篇关于LeetCode43. 字符串相乘(大数相乘)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944158

相关文章

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>