【问题标题】:Convert a list of digits to a natural number将数字列表转换为自然数
【发布时间】:2019-06-01 16:00:28
【问题描述】:

给定一个表示自然数和基数 >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)

【问题讨论】:

  • 嗯,你基本上已经有了所需的逻辑,这里只有一个常量应该用变量替换。
  • 您已经为基数 10 编写了 fromDigits,因此只需将 fromDigits xs 替换为 fromDigits 10 xs 并将 10 更改为变量。同时更新类型

标签: haskell


【解决方案1】:

一个以 r 为基数的位置数系统的结构是这样的,使得一个数 a1a2…a nai 一个数字,具有值:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2010-10-21
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多