-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path43-multiply-strings.swift
More file actions
53 lines (51 loc) · 1.44 KB
/
Copy path43-multiply-strings.swift
File metadata and controls
53 lines (51 loc) · 1.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class Solution {
func multiply(_ num1: String, _ num2: String) -> String {
if num2.count > num1.count {
return multiply(num2, num1)
}
var acc = "0"
var trailingZeros = ""
for digit in num2.reversed() {
acc = add(acc, trailingZeros + multiply(num1, digit.wholeNumberValue!))
trailingZeros += "0"
}
return String(acc.reversed())
}
func multiply(_ num1: String, _ num2: Int) -> String {
if num2 == 0 { return "0" }
var carry = 0
var result = ""
for digit in num1.reversed() {
let tmp = digit.wholeNumberValue! * num2 + carry
result += (tmp % 10).description
carry = tmp / 10
}
if carry > 0 {
result += carry.description
}
return result.isEmpty ? "0" : String(result)
}
func add(_ num1: String, _ num2: String) -> String {
if num2.count > num1.count {
return add(num2, num1)
}
var arr1 = Array(num1)
let arr2 = Array(num2)
var carry = 0
var digitIndex1 = 0
var digitIndex2 = 0
while digitIndex1 < arr1.count {
let digit1 = arr1[digitIndex1].wholeNumberValue!
let digit2 = digitIndex2 < arr2.count ? arr2[digitIndex2].wholeNumberValue! : 0
let tmp = carry + digit1 + digit2
arr1[digitIndex1] = (tmp % 10).description.first!
carry = tmp / 10
digitIndex1 += 1
digitIndex2 += 1
}
if carry > 0 {
arr1.append(carry.description.first!)
}
return String(arr1)
}
}