如何计算大数的位数? 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 的最近浮点表示形式不同,以至于它们落在整数的不同边,则该方法失败。您可能会检测到何时接近这种情况并以某种方式进行补救。