let rec sub' list1 list2 carry = match (list1, list2, carry) with
| list1, [], 0 -> list1
| [], list2, 0 -> list2
| list1, [], carry -> sub' list1 [carry] 0
| [], list2, carry -> sub' [carry] list2 0
| car1::cdr1, car2::cdr2, carry ->
let minus = car1 - car2 + carry
in minus mod radix :: sub' cdr1 cdr2 (minus / radix)基数设置为10
这是我用来减去两个数字(list1和list2)的代码。这是基于我修改过的给定代码,所以我不完全确定它是如何工作的。然而,对于大多数事情,它确实是有效的。5-4=1 10 - 20 = -10等
但是,对于更大的数字,它有一个奇怪的bug,100 - 50 = "1-50“,这是接近的,它有我们想要的"50”,但有一些额外的垃圾。
我试图弄清楚这个问题已经有一段时间了,但我还是被卡住了。
编辑:
let length = List.length
let car = List.hd
let cdr = List.tl
let map = List.map
let reverse = List.rev
let strcat = String.concat
let strlen = String.length
let strsub = String.sub
let zero = Bigint (Pos, [])
let rec zeros' rev =
if (car rev) = 0 then
lead_zeros' (cdr rev)
else (reverse rev)
let zeros list = match list with
| [0] -> list
| [] -> []
| list -> let reversed = reverse list
in lead_zeros' reversed发布于 2016-10-25 18:39:39
我没有完全分析你的代码,但我相信问题是除法舍入为零,而你需要它四舍五入。例如,(-3) / 5 = 0和(-3) mod 5 = -3,而您需要(-3) / 5 = -1和(-3) mod 5 = 2。
似乎不变量是minus >= -radix,所以一个简单的修复方法是将radix添加到minus中,然后相应地调整其他所有内容:
let minus = car1 - car2 + carry + radix
in minus mod radix :: sub' cdr1 cdr2 (minus / radix - 1)这将除法和模数转换到非负范围,在那里它可以像预期的那样工作。
https://stackoverflow.com/questions/40210447
复制相似问题