【发布时间】:2014-07-28 23:12:01
【问题描述】:
获取数字位数的最有效方法是什么?
让我们从一个例子开始:
想象一下斐波那契数列。现在假设我们想知道哪个斐波那契数是第一个具有 1000 位数字的数字(以 10 为基数表示)。最多 308 位(第 1476 个斐波那契数),我们可以使用 logBase 10 <number> 轻松完成此操作。如果该数字大于第 1476 个斐波那契数,logBase 将返回 Infinity,计算将失败。问题是 308 距离我们最初的目标 1000 有点远。
一种可能的解决方案是将我们想知道位数的数字转换为字符串,并使用它的长度来确定位数。这对我的目的来说有点低效,因为用 10000 尝试这个需要很长时间。
other questions 中显示的最有效方法是对我真的不想做的所有可能情况进行硬编码,特别是因为建议的解决方案中需要的位数超过 10。 p>
所以回到我的问题:确定以 10 为基数的位数的最佳(最有效)方法是什么?是真的将其转换为字符串并使用它的长度还是有像0x5f3759df 这样的“黑客”技巧?
注意:我很欣赏任何语言的解决方案,即使它被标记为“haskell”。
【问题讨论】:
-
~308 位听起来像是 64 位的双重限制..
-
@user2864740 是的,它确实是 64 位双精度的最大可能值。然而,Haskell 支持任意长的数字(使用
Integer),这就是为什么我的问题包括更大的数字。