leetcode 43 大数相乘

这题如果如果开挂的话, 可以直接用BigInteger类。

思路

用了三个辅助方法:

1. 大数相加。(顺带实现的,毕竟乘法的过程中需要用到加法)

2. 大数 * 一位数字 (很基础的步骤,列竖式的时候用到)

3. 去除结果的前导0。(很容易忽略,如0 * 123 结果会是 000,正确的结果应该是0)

然后就是利用这三个辅助方法得到最终结果。写法虽然直接但是有点繁琐,后续会考虑优化一下。

 1 class Solution {
 2     public String multiply(String num1, String num2) {
 3         String ans = "0";
 4         String carry = "";
 5         for (int i = num2.length() - 1; i >= 0; i--) {
 6             String tmp = singleMultiply(num1, num2.charAt(i));
 7             tmp = tmp + carry;
 8             ans = add(tmp, ans);
 9             carry = carry + "0";
10         }
11
12         //记得要去除leading zeros
13         return trimZeros(ans);
14     }
15
16     public String add(String num1, String num2) {
17         StringBuilder sb = new StringBuilder();
18         int n1 = num1.length();
19         int n2 = num2.length();
20         int i = n1 - 1, j = n2 - 1;
21         int carry = 0;
22         while (i >= 0 && j >= 0) {
23             int a = num1.charAt(i) - ‘0‘;
24             int b = num2.charAt(j) - ‘0‘;
25             int tmp = (a + b + carry) % 10;
26             carry = (a + b + carry) / 10;
27             sb.insert(0, tmp);
28             i--; j--;
29         }
30         while (i >= 0) {
31             int a = num1.charAt(i) - ‘0‘;
32             int tmp = (a + carry) % 10;
33             carry = (a + carry) / 10;
34             sb.insert(0, tmp);
35             i--;
36         }
37         while (j >= 0) {
38             int b = num2.charAt(j) - ‘0‘;
39             int tmp = (b + carry) % 10;
40             carry = (b + carry) / 10;
41             sb.insert(0, tmp);
42             j--;
43         }
44         if (carry > 0) {
45             sb.insert(0, carry);
46         }
47         return sb.toString();
48     }
49
50     public String singleMultiply(String num, char c) {
51         int d = c - ‘0‘;
52         int carry = 0;
53         StringBuilder sb = new StringBuilder();
54         for (int i = num.length() - 1; i >= 0; i--) {
55             int tmp = ((num.charAt(i) - ‘0‘) * d + carry) % 10;
56             carry = ((num.charAt(i) - ‘0‘) * d + carry) / 10;
57             sb.insert(0, tmp);
58         }
59         if (carry > 0) {
60             sb.insert(0, carry);
61         }
62         return sb.toString();
63     }
64
65     public String trimZeros(String s) {
66         StringBuilder sb = new StringBuilder(s);
67         while (sb.length() > 1 && sb.charAt(0) == ‘0‘) {
68             sb.deleteCharAt(0);
69         }
70         return sb.toString();
71     }
72 }

原文地址:https://www.cnblogs.com/hiyashinsu/p/10727359.html

时间: 2024-10-07 23:58:33

leetcode 43 大数相乘的相关文章

LeetCode 43. 字符串相乘(Multiply Strings)

43. 字符串相乘 43. Multiply Strings 题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. LeetCode43. Multiply Strings中等 示例 1: 输入: num1 = "2", num2 = "3" 输出: "6" 示例?2: 输入: num1 = "123", num2 = "456&q

LeetCode 43. 字符串相乘(Multiply Strings) 大数乘法

题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", num2 = "3" 输出: "6" 示例 2: 输入: num1 = "123", num2 = "456" 输出: "56088" 说明: num1 和 num2 的长度小于110. num1 和 nu

leetcode 43 Multiply Strings 大数相乘

感觉是大数相乘算法里面最能够描述.模拟演算过程的思路 class Solution { public String multiply(String num1, String num2) { if(num1.charAt(0) == '0' || num2.charAt(0) == '0'){ return "0"; } int len1 = num1.length(); int len2 = num2.length(); int len = len1+len2; int[] arr =

1051:A × B problem 大数相乘

给你两个整数,请你计算A × B. 输入 数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数.接着有T组数据,每组数据只有一行,包括两个非负整数A和B.但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出.但A和B的位数最大不会超过100位. 输出 对应每组测试数据,你都要输出两行:第一行为:"Case #:", # 代表这是第几组测试数据.第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果.你要注意

java版大数相乘

在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 http://blog.csdn.net/jianzhibeihang/article/details/4948267 用java搞了一个版本 这里说一下思路 将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次相乘,结果保存到result[]中 其他注意的在注释中有说明 1 package com.gxf.test; 2 3 import java.util.Scanner; 4 5 p

求解Catalan数,(大数相乘,大数相除,大数相加)

Catalan数 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜密率捷法>最早用到"卡塔兰数",远远早于卡塔兰.有中国学者建议将此数命名为"明安图数"或"明安图-卡塔兰数".卡塔兰数的一般公式为 C(2n,n)/(n+1). 性质: 令h(0)=1,h(1)=1,卡塔兰数满足递归式: h(n)= h(0)*

大数相乘、相加、相减、相除

实现大数的加.减.乘.除运算 1 package com.bignumber.test; 2 3 /** 4 * 大数运算(+.-.*./) 5 * @author chen 6 * 7 */ 8 public class BigNumber { 9 10 public static void main(String[] args) { 11 12 String str1 = "123456789";//大数一 13 String str2 = "9876543210&quo

LeetCode - 字符串数字相乘与相加

43. 字符串相乘 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", num2 = "3" 输出: "6" 示例 2: 输入: num1 = "123", num2 = "456" 输出: "56088" 说明: num1 和 num2 的长度小于110. num1

大数相乘

1.算法思路 将大数当做字符串进行处理,也就是将大数用十进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程得到乘法的结果. 乘积是逐位相乘,也就是a[i] * b[j],结果加入到积C的第i+j位,即 最后处理进位即可 例如:A =17 = 1*10 + 7 = (7,1)最后是十进制的幂表示法,幂次是从低位到高位,以下同. B=25 = 2*10 + 5 = (5, 2); C = A * B = (7 * 5, 1 * 5 + 2 * 7, 1 * 2) = (35, 19, 2)