来自http://projecteuler.net/index.php?section=problems&id=99
比较索引中写的两个数字 形式如2 11 和 3 7 并不困难 计算器会证实这一点 2 11 = 2048 3 7 = 2187。
然而,确认 632382 518061 > 519432 525806 会很多 两个数字都比较困难 包含超过三百万个数字。
使用base_exp.txt(右键单击 和'保存链接/目标为...'),22K 包含一千个的文本文件 打开基数/指数对的行 每一行,确定哪个行号 具有最大的数值。
我该如何处理?
答案 0 :(得分:16)
不是完整的解决方案,而是一些想法。您可以使用以下公式:
log(a x )= x * loga
log10可以很容易地估计为位数。通过计算右移可以很容易地估算log2。
基于以上所述,您可以显着缩小列表范围。对于剩余的数字,您必须进行完整的计算。项目Euler中是否允许数学函数?如果是,最好使用对数。
答案 1 :(得分:5)
由于对数是单调函数,而不是 x ,您可以比较x * log a以找到最大值。但是,您可能需要考虑数值精度。
答案 2 :(得分:2)
一种可能的方法是使用对数恒等式(即 b 与e b * ln a 相同)。事实上,除了0和1之外, b 与碱 b * log base a 相同。
答案 3 :(得分:2)
比较文件中每行的exponent * log(base)而不是base ^ exponent,可以解决此问题而不考虑精度。从数学的角度来看,这无疑是最好的解决方案,但我只想指出这不是必要的。
另一种可能的解决方案是在对现在较小的数字执行取幂之前,将文件中的每个数字除以某个常数(比如100,000)。由于您将所有值相互比较,因此将它们全部缩小为常数因子不会影响最终结果。