51 lines
1.1 KiB
Plaintext
51 lines
1.1 KiB
Plaintext
func long_multiplication(String a, String b) -> String {
|
|
|
|
if (a.len < b.len) {
|
|
(a, b) = (b, a)
|
|
}
|
|
|
|
'0' ~~ [a, b] && return '0'
|
|
|
|
var x = a.reverse.chars.map{.to_n}
|
|
var y = b.reverse.chars.map{.to_n}
|
|
|
|
var xlen = x.end
|
|
var ylen = y.end
|
|
|
|
var mem = 0
|
|
var map = y.len.of { [] }
|
|
|
|
for j in ^y {
|
|
for i in ^x {
|
|
var n = (x[i]*y[j] + mem)
|
|
var(d, m) = n.divmod(10)
|
|
if (i == xlen) {
|
|
map[j] << (m, d)
|
|
mem = 0;
|
|
}
|
|
else {
|
|
map[j] << m
|
|
mem = d
|
|
}
|
|
}
|
|
|
|
var n = (ylen - j)
|
|
n > 0 && map[j].append(n.of(0)...)
|
|
var m = (ylen - n)
|
|
m > 0 && map[j].prepend(m.of(0)...)
|
|
}
|
|
|
|
var result = []
|
|
var mrange = ^map
|
|
var end = (xlen + ylen + 2)
|
|
|
|
for i in ^end {
|
|
var n = (mrange.map {|j| map[j][i] }.sum + mem)
|
|
(mem, result[result.end+1]) = n.divmod(10)
|
|
}
|
|
|
|
result.join.reverse -= /^0+/
|
|
}
|
|
|
|
say long_multiplication('18446744073709551616', '18446744073709551616')
|