Project Euler 99: Largest exponential

比较像\(2^{11}\)\(3^7\)这样用指数形式表示的数并不困难,因为任何计算器都可以确认:
\[ 2^{11}=2048<3^7=2187 \]
然而,确认\(632382^{518601}>519432^{525806}\)就要困难得多,因为两个数都包含三百万位数。文本文件 base_exp.txt中包含一千行数据,每一行都是幂的底与指数的组合,求那一行的数值最大。

注:文本文件中的前两行即为上面例子中所列的两个数。

分析:此题的求解思路比较直接,虽然我们知道python默认支持大整数,可以计算出文件中所列的那些数字,但是直接这样计算效率上会有损失。考虑到题目只是要比较这些指数的大小,而不是要求计算出这些指数,所以我们可以利用对数的性质把上述指数转化为较小的数字来进行比较。我们都知道对数函数是一个单调递增函数,所以如果\(log(x)>log(y)\),则我们有\(x>y\),同时我们知道\(log(a^b)=blog(a)\),则我们可以对文件中每一行的指数直接取对数,然后比较这些对数的大小,最大的对数就对应最大的指数,其对应的行数即是题目所求。

# time cost = 1.51 ms ± 24.9 µs

from math import log10

def main():
    with open('data/ep99.txt') as f:
        pairs = [list(map(int,s.split(','))) for s in f.readlines()]
    log_pairs = [x[1]*log10(x[0]) for x in pairs]
    return log_pairs.index(max(log_pairs))+1

猜你喜欢

转载自www.cnblogs.com/metaquant/p/12198151.html