如何解决「大数最后一位」任务的Python代码超时问题?
解决大数幂最后一位计算超时问题
你的代码核心问题是直接计算n1**n2——这两个输入都是远超常规计算范围的超大数,生成这个数需要消耗极多的计算资源和内存,自然会出现超时甚至内存溢出的情况。要解决这个问题,完全不需要计算完整的幂,只需要利用数字最后一位的循环规律和模运算性质即可。
核心思路
一个数的幂的最后一位是周期性循环的,比如:
- 2的幂最后一位循环:2→4→8→6→2...(周期4)
- 3的幂最后一位循环:3→9→7→1→3...(周期4)
- 4的幂最后一位循环:4→6→4...(周期2)
同时根据模运算规则:(a^b) mod 10 = [(a mod 10)^b] mod 10,也就是说,我们只需要关注n1的最后一位,再结合幂的循环周期就能快速得到结果。
优化后的代码
def last_digit(n1, n2): # 处理0次幂的特殊情况(任何数的0次幂为1,0^0可根据需求调整) if n2 == 0: return 1 # 取n1的最后一位 last_n1 = n1 % 10 # 定义各数字的最后一位循环序列 cycles = { 0: [0], 1: [1], 2: [2, 4, 8, 6], 3: [3, 9, 7, 1], 4: [4, 6], 5: [5], 6: [6], 7: [7, 9, 3, 1], 8: [8, 4, 2, 6], 9: [9, 1] } cycle = cycles[last_n1] # 计算幂在循环中的位置(索引从0开始,所以用n2-1取模) position = (n2 - 1) % len(cycle) return cycle[position] # 测试你的输入 print(last_digit(3715290469715693021198967285016729344580685479654510946723, 68819615221552997273737174557165657483427362207517952651))
结果验证
你的输入中,n1的最后一位是3,对应的循环周期是4。计算n2-1对4取模:68819615221552997273737174557165657483427362207517952651 - 1 = 68819615221552997273737174557165657483427362207517952650
这个数的最后两位是50,50 mod4=2,所以索引是2,对应循环序列[3,9,7,1]中的第3个元素(索引从0开始),也就是7,所以程序会输出7。
额外说明
原代码中str(number).split()是多余的操作,直接用str(number)[-1]就能取最后一位,但这不是导致超时的原因——真正的问题是计算超大数幂的过程本身。
内容的提问来源于stack exchange,提问作者Nihat Sadiqzada
相关产品推荐
相关产品推荐

