Python分页计算代码无法输出最后一个测试用例结果,求排查
问题分析:代码无法输出排名74对应页码的原因
问题背景
Chef参加竞赛获得排名X,需计算其所在的榜单页码,每页固定显示25名参赛者。输入规则为:第一行输入测试用例数T,每个测试用例输入一个排名X,输出对应页码。
测试用例
输入:
4 1 34 150 74
预期输出:
1 2 6 3
用户代码
arr = [] for i in range(x): m = int(input()) arr.append(m) times = 1 res = 25 end = 25 stt = 0 for i in arr: f = True while f: if i > stt and i < end+1: f = False print(times) else: times += 1 stt = end end = res * times
核心问题原因
你的代码在处理完前三个测试用例后,times、stt、end这几个变量的状态已经变成了:
times = 6stt = 125end = 150
当处理第四个排名74时,进入while循环后:
- 74并不大于125,触发else分支,
times变成7,stt更新为150,end变成175 - 再次判断,74还是小于150,继续循环,
times持续递增,stt和end也不断变大,永远满足不了i > stt and i < end+1的条件,直接陷入死循环,自然不会输出任何结果。
本质问题是:你没有为每个测试用例单独初始化页码相关变量,而是一直沿用前一个测试用例处理后的状态,导致小数值的排名无法匹配当前的区间范围。
修正方案
把times、stt、end的初始化代码移到处理每个测试用例的循环内部,确保每个排名都从第一页开始判断:
# 先修正原代码中未定义的x,改为获取测试用例数T T = int(input()) arr = [] for i in range(T): m = int(input()) arr.append(m) for i in arr: # 每个测试用例都重置页码变量 times = 1 res = 25 end = 25 stt = 0 f = True while f: # 把i < end+1改成i <= end,逻辑等价但更直观 if i > stt and i <= end: f = False print(times) else: times += 1 stt = end end = res * times
更简洁的解法
其实这个问题不需要循环判断,用数学公式就能直接算出页码:(排名X + 24) // 25(整数除法)。原理是把排名向上取整到最近的25的倍数,再除以25。比如:
- 74 +24 = 98,98 //25 =3,正好是正确页码
- 150+24=174,174//25=6,符合预期
用这个方法的代码更高效简洁:
T = int(input()) for _ in range(T): X = int(input()) print((X + 24) // 25)
内容的提问来源于stack exchange,提问作者Phani
相关产品推荐
相关产品推荐

