2016-12-05 23:44:36 +01:00
|
|
|
|
func add_with_carry(result, addend, addendpos) {
|
|
|
|
|
|
loop {
|
|
|
|
|
|
while (result.len < addendpos+1) {
|
2018-06-22 20:57:24 +00:00
|
|
|
|
result.append(0)
|
|
|
|
|
|
}
|
|
|
|
|
|
var addend_digits = (addend.to_i + result[addendpos] -> to_s.chars)
|
|
|
|
|
|
result[addendpos] = addend_digits.pop
|
|
|
|
|
|
addend_digits.len > 0 || break
|
|
|
|
|
|
addend = addend_digits.pop
|
|
|
|
|
|
addendpos++
|
2016-12-05 23:44:36 +01:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2018-06-22 20:57:24 +00:00
|
|
|
|
|
2016-12-05 23:44:36 +01:00
|
|
|
|
func longhand_multiplication(multiplicand, multiplier) {
|
2018-06-22 20:57:24 +00:00
|
|
|
|
|
|
|
|
|
|
var result = []
|
|
|
|
|
|
var multiplicand_offset = 0
|
|
|
|
|
|
|
2016-12-05 23:44:36 +01:00
|
|
|
|
multiplicand.reverse.each { |multiplicand_digit|
|
2018-06-22 20:57:24 +00:00
|
|
|
|
var multiplier_offset = multiplicand_offset
|
2016-12-05 23:44:36 +01:00
|
|
|
|
multiplier.reverse.each { |multiplier_digit|
|
2018-06-22 20:57:24 +00:00
|
|
|
|
var multiplication_result = (multiplicand_digit.to_i * multiplier_digit.to_i -> to_s)
|
|
|
|
|
|
|
|
|
|
|
|
var addend_offset = multiplier_offset
|
2016-12-05 23:44:36 +01:00
|
|
|
|
multiplication_result.reverse.each { |result_digit_addend|
|
2018-06-22 20:57:24 +00:00
|
|
|
|
add_with_carry(result, result_digit_addend, addend_offset)
|
|
|
|
|
|
addend_offset++
|
|
|
|
|
|
}
|
|
|
|
|
|
multiplier_offset++
|
|
|
|
|
|
}
|
|
|
|
|
|
multiplicand_offset++
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result.join.reverse
|
2016-12-05 23:44:36 +01:00
|
|
|
|
}
|
2018-06-22 20:57:24 +00:00
|
|
|
|
|
|
|
|
|
|
say longhand_multiplication('18446744073709551616', '18446744073709551616')
|