如何计算大数上的位数?C++

How to calculate number of digits on huge number? C++

本文关键字:C++ 何计算 计算      更新时间:2023-10-16

所以我遇到的问题是有两个整数 (a, b) 在 [1, 10^16] 区间,我需要找出数字 a^b 有多少位?这些数字太大了,无法将它们保存在单个变量上,如果我将它们写在 Array 上,则需要花费大量时间。

有没有办法用某种公式或任何更简单的方法计算数字 a^b 位数,然后是数组?

修复了评论中建议的一次性错误后

a^b = floor( b * log(a) ) + 1位数

卡拉克法说得对。

数字n的底数k对数,四舍五入到最接近的整数,将为您提供以基数k表示n所需的位数。

编辑:正如评论中指出的,它不应该向上舍入,而是向下舍入,然后增加一个。这解释了 10 的舍入幂有一个额外的数字。

如果你的数字a^b那么取以 10 为底的对数,log a^b并使用对数定律简化为b log a。请注意,此简化发生在ceiling函数内部,因此简化有效。计算log a应该不是问题(它将在 0 到 16 之间),并且已知b。只要确保在乘法后四舍五入,而不是在乘法之前。

请注意,浮点数的有限精度可能会给此方法带来一些错误。如果b x log a的真实值与b x log a的最接近浮点表示形式不同,以至于它们落在整数的不同边,则该方法将失败。您可以检测到何时接近这种情况并以某种方式对其进行修正。

您可以使用支持任意大数字的库,例如 GMP 。

核心C++语言本身不提供处理如此大数字的类型。因此,要么使用预先存在的库,要么自己编写一个(我建议前者 - 不要重新发明轮子)。