ProjectEuler问题的算法99

时间:2009-01-13 10:34:37

标签: algorithm math

来自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   包含一千个的文本文件   打开基数/指数对的行   每一行,确定哪个行号   具有最大的数值。

我该如何处理?

4 个答案:

答案 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)。由于您将所有值相互比较,因此将它们全部缩小为常数因子不会影响最终结果。