字符串相乘——大整数乘法
概述
给定两个以字符串形式表示的非负整数 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位 ...
最新文章
- 都是程序员,凭什么他能站在鄙视链的顶端?
- mysql 差异还原_MySQL差异转储? 还原的其他策略?
- 这届全明星,把NBA又燃回来了
- 那些女程序员们的故事
- UIWebView捕获内部web点击事件
- 软件行业做了3年,何去何从?到底该搞哪个方面?迷茫+努力
- Azure 网站上的 Java
- java前端学习路线_Java前端需要学什么?Java前端学习路线分享
- 易语言取linux命令返回值,易语言返回命令使用讲解
- WinRAR 32位解压缩软件 v5.21 汉化免费版
- 计算机视觉-1.2手写字体识别
- threejs写的模仿微信跳一跳游戏
- JavaScript程序设计(笔记1)
- PubWin服务器同步时间
- GO语言-数据结构-栈
- 豆瓣评论数据词云画像()
- 计算机房的网络化管理,学校计算机房的设计与管理
- 简单易学的机器学习算法——梯度提升决策树GBDT
- 互联网、因特网以及万维网之间的区别和联系
- http://www.dewen.net.cn/q/15051/C++ 整形和浮点数相除的精度问题