字符串相乘——大整数乘法
概述
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
输入: num1 = “2”, num2 = “3”
输出: “6”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
常规思路: 1234 * 456 = 1234 * 6 + 1234 * 50 + 1234 * 400
由于 0 乘以任何数都是 0,所以 1234 * 50 = 1234 * 5 的结果加上一个 0,1234 * 400 的结果等于 1234 * 4 的结果结尾加上两个 0;
其次将计算结果相加,又用到了字符串的加法实现;字符串的加法实现也是类似,从末位开始相加,超过 10 就进位。
实现
class Solution {public String multiply(String num1, String num2) {if ("0".equals(num1) || "0".equals(num2)){return "0";}int count = 0; // 表示第几次循环,用于字符串结尾加 0 String answer = "0"; for (int i = num2.length() - 1; i >= 0 ; i--) { // 从 num2 的末尾开始,与 num1 的各个位相乘char tempNum2 = num2.charAt(i);int jinwei = 0; // 进位StringBuilder stringBuilder = new StringBuilder();int tempNum2Int = tempNum2 - '0'; for (int j = num1.length() - 1; j >= 0 ; j--) { // 将 num1 的各位与 num2 的当前字符相乘int tempNum1Int = num1.charAt(j) - '0';int result = tempNum2Int * tempNum1Int + jinwei; // stringBuilder.append(result % 10);jinwei = result / 10;}if (jinwei > 0){stringBuilder.append(jinwei);}stringBuilder = stringBuilder.reverse();// 结尾加 0 for (int j = 0; j < count; j++) {stringBuilder.append("0");}count++;// 大整数加法answer = stringAdd(answer,stringBuilder.toString());}return answer;}/*** 大整数加法* @param str1* @param str2* @return*/public String stringAdd(String str1, String str2){int num1Length = str1.length();int num2Length = str2.length();int maxLength = Math.max(num1Length,num2Length);// 少位的补 0 对齐if (num1Length < num2Length){for (int i = 0; i < num2Length-num1Length; i++) {str1 = '0' + str1;}}if (num1Length > num2Length){for (int i = 0; i < num1Length-num2Length; i++) {str2 = '0' + str2;}}StringBuilder stringBuilder = new StringBuilder();int jinwei = 0;for (int j = maxLength - 1;j >= 0 ;j--){int num1 = str1.charAt(j) - '0';int num2 = str2.charAt(j) - '0';int ans = num1 + num2 + jinwei;jinwei = ans / 10;stringBuilder.append(ans % 10);}// 有进位if (jinwei > 0){stringBuilder.append(jinwei);}return stringBuilder.reverse().toString();}
}
总结
其实就是考察移位运算的熟练程度,穿插了字符串加法的实现。
LeetCode 字符串加法
字符串相乘——大整数乘法相关推荐
- 大整数乘法(Karatsuba算法的字符串形式的C++实现)
#include <iostream> #include <sstream> #include <cstring> using namespace std;/函数声 ...
- python两数相乘代码_Python 实现大整数乘法算法的示例代码
我们平时接触的长乘法,按位相乘,是一种时间复杂度为 O(n ^ 2) 的算法.今天,我们来介绍一种时间复杂度为 O (n ^ log 3) 的大整数乘法(log 表示以 2 为底的对数). 介绍原理 ...
- 大整数乘法c语言代码_大整数乘法
大整数乘法和我们小学学过的乘法公式一样(如下图),就是按位相乘,两个数中的每一位彼此相乘,然后将相同列的结果加起来,最后统一处理进位即可. #include <iostream> #inc ...
- 信息学奥赛一本通(1174:大整数乘法)
1174:大整数乘法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 12480 通过数: 7002 [题目描述] 求两个不超过200位的非负整数的积. [ ...
- 计算机算法设计与分析 大整数乘法
大整数乘法 问题描述 求两个不超过200位的非负整数的积. 输入形式 有两行,每行是一个不超过200位的非负整数,没有多余的前导0. 输出形式 一行,即相乘后的结果.结果里不能有多余的前导0,即如果结 ...
- 分治法实验之大整数乘法(算法设计分析)
分治法实验之大整数乘法 01. 问题描述 02. 输入格式 03. 输出格式 04. 输入样例 05. 输出样例 06. 问题分析 07. 算法设计 08. 代码实现 09. 测试结果 10. 复杂度 ...
- 大整数乘法(递归+分治法)
目录 一.问题描述 二.思路分析 分治法介绍: 问题分析: 三.算法伪代码 四.代码实现效果 五.源代码 六.参考文章 一.问题描述 请设计一个有效的算法,可以进行两个n位大整数的乘法.(n=2^k, ...
- 分治算法经典问题---大整数乘法(1~32位大整数乘法)C++
大整数乘法 大整数乘法(1~32位大整数乘法) 分治的思想 实验题目及要求(大整数乘法) 算法分析(result=m4*10^2^+(m2+m3)*10^n/2^+m1) 算法分析 代码 源文件 ma ...
- 大数乘法python_大整数乘法python3实现
由于python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,但是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位 ...
最新文章
- S2-045漏洞利用工具解决方案
- linux top 命令信息解释
- 突发信号matlab,MATLAB信号处理仿真
- 线程同步之——互斥量及死锁问题
- 【USACO 3.1】Contact(01子串按出现次数排序)
- python找与7相关的数字_C++和python实现阿姆斯特朗数字查找实例代码
- python idle 清屏问题的解决
- linux配置libpng环境变量_不同操作系统下 jdk 的配置
- TF-Lite极简参考-环境搭建
- 如何保持交互的可见性
- php获取qq头像地址,使用PHP语言通过邮箱获取全球公认的Gravatar头像地址
- HTML/CSS 长度单位 px和pt的区别
- 期刊评价查询+机器人领域期刊排名
- vivoX9手机拆解
- 推挽变换器漏感电压尖峰
- js验证身份证合法性(最后一位的校验)
- Ti 949 配置 948 i2c
- 利用定时器实现倒计时
- 最新史上最权威的Oracle学习路线视频教程(价值2w)
- 第二章大数据技术概述