如何计算庞大数字的位数? C ++

时间:2017-03-15 20:41:03

标签: c++ logic pow

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

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

3 个答案:

答案 0 :(得分:6)

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

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

的位数

答案 1 :(得分:1)

karakfa没错。

数字k的基数 - n对数,向上舍入到最接近的整数,将为您提供在n中表示k所需的位数}。

编辑:正如评论中指出的那样,它不应该向上舍入,而是向下舍入然后加1。这可以解释10的额外数字的圆函数。

如果您的号码为a^b,则取基数10对数log a^b并使用对数定律简化为b log a。请注意,这种简化发生在ceiling函数内部,因此简化是有效的。计算log a应该不是问题(它将在0到16之间)并且b是已知的。只需确保在乘以之后进行舍入,而不是之前。

请注意,浮点数的精度有限可能会在此方法中引入一些错误。如果b x log a的真值与b x log a的最近浮点表示不同,使得它们落在整数的不同边上,则该方法失败。您可以检测到您接近这种情况并以某种方式对其进行修复。

答案 2 :(得分:0)

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

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