1+ // 43. 字符串相乘
2+
3+
4+ /*
5+ 模拟相乘:遍历num2每一位与num1进行相乘,将每一步的结果进行累加
6+ 1、其中一个数为0,则乘积为0
7+ 2、从右到左遍历num2,根据当前位数对结果补0,获取当前位置数字n1
8+ 3、从右到左遍历num1,如果num1遍历完了但当前进位大于0则赋值数字为0,否则直接获取,最终得到当前位置数字n2
9+ 4、两数相乘得到乘积,取个位存入结果字符串,取十位作为进位。直到计算完num2的一位与num1的所有位乘积
10+ 5、num2每计算完一位后,就要把当前计算结果与前面的计算结果进行字符串相加,最终得到num2每一位乘积结果的和
11+
12+ num1 1 2 3
13+ num2 4 5 6
14+ ---------
15+ 7 3 8
16+ 6 1 5 0
17+ 4 9 2 0 0
18+ */
19+ class Solution {
20+ public String multiply (String num1 , String num2 ) {
21+ if (num1 .equals ("0" ) || num2 .equals ("0" )) {
22+ return "0" ;
23+ }
24+ String res = "0" ;
25+ int len1 = num1 .length ();
26+ int len2 = num2 .length ();
27+ for (int i = len2 - 1 ; i >= 0 ; i --) {
28+ int carry = 0 ;
29+ StringBuilder temp = new StringBuilder ();
30+ for (int k = 0 ; k < len2 - 1 - i ; k ++) {
31+ temp .append ("0" );
32+ }
33+ int n2 = num2 .charAt (i ) - '0' ;
34+ for (int j = len1 - 1 ; j >= 0 || carry > 0 ; j --) {
35+ int n1 = j >= 0 ? num1 .charAt (j ) - '0' : 0 ;
36+ int multiply = (n1 * n2 + carry );
37+ temp .append (multiply % 10 );
38+ carry = multiply / 10 ;
39+ }
40+ res = addStrings (res , temp .reverse ().toString ());
41+ }
42+ return res ;
43+ }
44+
45+ // 415. 字符串相加
46+ private String addStrings (String num1 , String num2 ) {
47+ int i = num1 .length () - 1 ;
48+ int j = num2 .length () - 1 ;
49+ int carry = 0 ;
50+ StringBuilder res = new StringBuilder ();
51+ while (i >= 0 || j >= 0 || carry > 0 ) {
52+ int x = i >= 0 ? num1 .charAt (i --) - '0' : 0 ;
53+ int y = j >= 0 ? num2 .charAt (j --) - '0' : 0 ;
54+ int sum = x + y + carry ;
55+ carry = sum / 10 ;
56+ res .append (sum % 10 );
57+ }
58+ return res .reverse ().toString ();
59+ }
60+ }
61+
62+
63+ /*
64+ 两数相乘位置规律:
65+ 1、乘数 num1 位数为 M,被乘数 num2 位数为 N, num1 x num2 结果 res 最大总位数为 M+N
66+ 2、num1[i] x num2[j] 的结果 multiply 位数为两位,"0x" 或 "xy" 的形式,其第一位位于 cal[i+j],第二位位于 cal[i+j+1]
67+ 3、从右到左遍历num1和num2,分别取出两个数字相乘,再加上一步乘积的十位防止被覆盖,然后将结果的个位和十位存入cal数组
68+ 4、遍历cal数组,构造结果字符串返回
69+
70+ 1 2 3 ==> 2的索引i为1
71+ 4 5 ==> 4的索引j为0
72+ ----------
73+ 1 5
74+ 1 0
75+ 0 5
76+ ----------
77+ 1 2
78+ 0 8 ==> cal[i+1] cal[i+j+1]
79+ 0 4
80+ ----------
81+ cal 0 1 2 3 4
82+
83+ */
84+ class Solution {
85+ public String multiply (String num1 , String num2 ) {
86+ if (num1 .equals ("0" ) || num2 .equals ("0" )) {
87+ return "0" ;
88+ }
89+ int len1 = num1 .length ();
90+ int len2 = num2 .length ();
91+ int [] cal = new int [len1 + len2 ];
92+ for (int i = len1 - 1 ; i >= 0 ; i --) {
93+ int n1 = num1 .charAt (i ) - '0' ;
94+ for (int j = len2 - 1 ; j >= 0 ; j --) {
95+ int n2 = num2 .charAt (j ) - '0' ;
96+ int multiply = (n1 * n2 + cal [i + j + 1 ]);
97+ cal [i + j + 1 ] = multiply % 10 ;
98+ cal [i + j ] += multiply / 10 ;
99+ }
100+ }
101+ StringBuilder res = new StringBuilder ();
102+ for (int i = 0 ; i < cal .length ; i ++) {
103+ if (i == 0 && cal [i ] == 0 ) {
104+ continue ;
105+ }
106+ res .append (cal [i ]);
107+ }
108+ return res .toString ();
109+ }
110+ }
0 commit comments