如何计算大数的位数? C++
How to calculate number of digits on huge number? C++
所以我遇到的问题是 [1, 10^16] 区间内有两个整数 (a, b),我需要找出 a^b 有多少位数?这些数字太大了,无法将它们保存在单个变量上,如果我将它们写在数组上会花费很多时间。
有没有办法用某种公式或比数组更简单的方法来计算 a^b 位数?
您可以使用支持任意大数字的库,例如 GMP 。
核心 C++ 语言本身不提供任何类型来处理如此大的数字。所以要么你使用一个预先存在的库,要么自己写一个(我建议前者 - 不要重新发明轮子)。
修复评论中建议的一次性错误后
a^b = floor( b * log(a) ) + 1
的位数
karakfa 说得对。
数字 n
的底数 k
对数四舍五入到最接近的整数,将为您提供以底数 [=] 表示 n
所需的位数10=].
编辑:正如评论中指出的那样,它不应该四舍五入,而是四舍五入然后加一。这说明了 10 的整数次幂有一个额外的数字。
如果你的数字是a^b
,那么取以10为底的对数,log a^b
并使用对数定律简化为b log a
。请注意,此简化发生在 ceiling
函数内部,因此简化是有效的。计算 log a
应该不是问题(它将在 0 和 16 之间)并且 b
是已知的。请确保在相乘之后四舍五入,而不是之前。
请注意,浮点数的有限精度可能会给该方法带来一些错误。如果 b x log a
的真实值与 b x log a
的最近浮点表示形式不同,以至于它们落在整数的不同边,则该方法失败。您可能会检测到何时接近这种情况并以某种方式进行补救。
所以我遇到的问题是 [1, 10^16] 区间内有两个整数 (a, b),我需要找出 a^b 有多少位数?这些数字太大了,无法将它们保存在单个变量上,如果我将它们写在数组上会花费很多时间。
有没有办法用某种公式或比数组更简单的方法来计算 a^b 位数?
您可以使用支持任意大数字的库,例如 GMP 。
核心 C++ 语言本身不提供任何类型来处理如此大的数字。所以要么你使用一个预先存在的库,要么自己写一个(我建议前者 - 不要重新发明轮子)。
修复评论中建议的一次性错误后
a^b = floor( b * log(a) ) + 1
的位数
karakfa 说得对。
数字 n
的底数 k
对数四舍五入到最接近的整数,将为您提供以底数 [=] 表示 n
所需的位数10=].
编辑:正如评论中指出的那样,它不应该四舍五入,而是四舍五入然后加一。这说明了 10 的整数次幂有一个额外的数字。
如果你的数字是a^b
,那么取以10为底的对数,log a^b
并使用对数定律简化为b log a
。请注意,此简化发生在 ceiling
函数内部,因此简化是有效的。计算 log a
应该不是问题(它将在 0 和 16 之间)并且 b
是已知的。请确保在相乘之后四舍五入,而不是之前。
请注意,浮点数的有限精度可能会给该方法带来一些错误。如果 b x log a
的真实值与 b x log a
的最近浮点表示形式不同,以至于它们落在整数的不同边,则该方法失败。您可能会检测到何时接近这种情况并以某种方式进行补救。