首页 > 解决方案 > 将数字列表转换为自然数

问题描述

给定一个表示自然数和基数 >2 的数字列表,如何输出正确的自然数。即给定 [1,2,3] 和以 10 为底,我们得到 123。给定 [1,0,1] 和以 2 为底,我们得到 5。

有一些例子涵盖了使用 div 和 mod 将数字转换为列表,但我不知道如何做相反的事情(对于二进制数,对于小数,它很容易将数字列表直接转换为 int,但我假设有一个在这两种情况下都有效的数学方法)。

--For decimal conversion:
fromDigits :: [Integer] -> Integer
fromDigits xs = aux xs 0
where aux [] acc = acc
      aux (x:xs) acc  = aux xs ((acc * 10) + x)

标签: haskell

解决方案


以r为基数的位置数系以这样的方式构造,使得数字a 1 a 2 …a na i数字具有值:

a_i 乘以 r^(ni) 的总和

这意味着我们可以通过以下方式获得一系列数字的数字:

fromDigits :: (Num a, Foldable f) => a -> f a -> a
fromDigits r = foldl (\a x -> r * a + x) 0

或者在语法上更紧凑:

fromDigits :: (Num a, Foldable f) => a -> f a -> a
fromDigits r = foldl ((+) . (r *)) 0

每次迭代,我们将累加器与基数相乘r,然后将下一个数字加到它上面。最终,如果数字包含n位,则第一位数字将因此乘以基数r n次。

例如,1425对于不同的基数,该数字具有不同的值:

Prelude> fromDigits 6 [1,4,2,5]
377
Prelude> fromDigits 7 [1,4,2,5]
558
Prelude> fromDigits 8 [1,4,2,5]
789
Prelude> fromDigits 9 [1,4,2,5]
1076
Prelude> fromDigits 10 [1,4,2,5]
1425

推荐阅读