Skip to content

Instantly share code, notes, and snippets.

@sssbohdan
Created May 6, 2023 19:51
Show Gist options
  • Save sssbohdan/ec0da6bdce4692983a31e2c0c0d90c63 to your computer and use it in GitHub Desktop.
Save sssbohdan/ec0da6bdce4692983a31e2c0c0d90c63 to your computer and use it in GitHub Desktop.
BigInt2.swift
struct BigInt {
let string: String
func add(_ value: BigInt) -> BigInt {
if self.string == "0" { return value }
if value.string == "0" { return self }
var lhs = self.string
var rhs = value.string
if lhs.count < rhs.count {
lhs = String(repeating: "0", count: rhs.count - lhs.count) + lhs
} else if lhs.count > rhs.count {
rhs = String(repeating: "0", count: lhs.count - rhs.count) + rhs
}
var movedToNext = 0
var acc = ""
for pair in zip(lhs.reversed(), rhs.reversed()) {
let lhsDigit = Int(String(pair.0))!
let rhsDigit = Int(String(pair.1))!
let sum = (lhsDigit + rhsDigit + movedToNext)
let lastDigit = sum % 10
movedToNext = sum / 10
acc = "\(lastDigit)" + acc
}
let string = movedToNext == 0
? acc
: "\(movedToNext)" + acc
return BigInt(string: string)
}
func multiply(by value: BigInt) -> BigInt {
let lhs = Array(String(self.string.reversed()))
let rhs = Array(String(value.string.reversed()))
var totalAcc = "0"
for (index, l) in lhs.enumerated() {
var movedToNext = 0
var acc = String(repeating: "0", count: index)
for r in rhs {
let sum = Int(String(r))! * Int(String(l))! + movedToNext
let lastDigit = sum % 10
movedToNext = sum / 10
acc = "\(lastDigit)" + acc
}
acc = movedToNext == 0 ? acc : "\(movedToNext)" + acc
totalAcc = BigInt(string: totalAcc).add(BigInt(string: acc)).string
}
return BigInt(string: totalAcc)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment