所以我遇到的问题是有两个整数(a,b)在[1,10 ^ 16]区间内,我需要找出a ^ b有多少位数?这些数字对于将它们保存在单个变量上来说太大了,如果我在Array上写它们会花费很多时间。
有没有办法用某种公式计算数字a ^ b的数字位数,或者采用任何比数组更简单的方法?
答案 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 ++语言本身不提供任何类型来处理这么大的数字。所以要么你使用一个预先存在的库,要么自己写一个(我建议前者 - 不要重新发明轮子)。