如何计算大数上的位数?C++
How to calculate number of digits on huge number? C++
所以我遇到的问题是有两个整数 (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++语言本身不提供处理如此大数字的类型。因此,要么使用预先存在的库,要么自己编写一个(我建议前者 - 不要重新发明轮子)。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- Python中的for循环与C++有何不同
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算