CodeWars大数幂最后一位问题:Python代码特定测试用例失败排查
解决《Last digit of a large number》超大数测试用例错误问题
核心问题排查
你用幂最后一位的周期特性思路是对的,但出错大概率是没考虑尾数周期的差异性,或是超大指数的模运算逻辑错误,以下是具体分析:
1. 尾数周期并非全为4
不同数字的幂最后一位周期不一样,不能统一按4处理:
- 尾数0、1、5、6:幂的最后一位永远是自身,周期为1
- 尾数4、9:周期是2(比如41=4,42=6,4^3=4,循环)
- 只有尾数2、3、7、8的周期是4
2. 超大指数的模运算误区
当处理极大数b时,计算周期对应的指数时要注意:
- 若周期为4,当
b % 4 == 0时,不能直接取0次幂(结果为1),而要取4次幂的结果(比如34最后一位是1,38也是1,对应周期的最后一个值) - 若直接用
b % 4的结果作为指数,会导致模4为0时的错误。
3. 特殊情况遗漏
题目明确0^0视为1,必须单独判断b=0的情况,无论a是什么,直接返回1。
针对你的测试用例验证
你的测试用例:
- a的最后一位是3
- b的最后两位是651,651%4=3,所以对应3^3的最后一位,结果是7
如果你的代码没处理周期差异,或是模4为0的情况,就会返回错误值。
修正后的代码
def last_digit(a, b): if b == 0: return 1 # 取a的最后一位 last_a = int(str(a)[-1]) if a != 0 else 0 # 周期1的情况 if last_a in {0, 1, 5, 6}: return last_a # 周期2的情况 elif last_a in {4, 9}: exp = b % 2 return last_a ** (2 if exp == 0 else exp) % 10 # 周期4的情况 else: exp = b % 4 return last_a ** (4 if exp == 0 else exp) % 10
这个代码能正确处理你给出的超大数测试用例,返回结果7。
内容的提问来源于stack exchange,提问作者singleslit
相关产品推荐
相关产品推荐

