解决Beecrowd提交代码时的IndexError: list index out of range问题
修复方案:解决IndexError列表索引越界问题
错误原因
报错IndexError: list index out of range出现在if (isPrime(vet[i])):这一行,说明**vet列表的长度小于你读取的N值**。本地测试时你输入的第二行刚好有N个数字,但平台的测试用例可能存在以下情况:
- 第二行输入的数字数量不足
N个 - 输入的数字被拆分成了多行(比如部分数字在第三行及以后)
另外,当前代码中fact数组只预计算到了99!(因为range(1,100)生成1到99的数,fact的索引最大为99),如果输入的质数大于99,后续访问fact[vet[i]]也会触发同样的索引错误。
修改后的代码
import math import sys def isPrime(N): if N == 1: return False if N == 2: return True root = int(math.sqrt(N)) + 1 for i in range(2, root): if N % i == 0: return False return True # 预计算足够大的阶乘,可根据题目输入范围调整max_fact值 max_fact = 1000 fact = [1] * (max_fact + 1) for i in range(1, max_fact + 1): fact[i] = fact[i-1] * i # 一次性读取所有输入,避免单行输入限制 all_input = list(map(int, sys.stdin.read().split())) N = all_input[0] vet = all_input[1:N+1] # 直接遍历vet元素,避免索引操作出错 for num in vet: if isPrime(num): print("{0}! = {1}".format(num, fact[num]))
关键修改点
- 统一读取输入:用
sys.stdin.read()一次性读取所有输入内容,再拆分转换成整数列表。这样不管输入是单行还是多行,都能完整获取所有数字,确保vet的长度刚好为N。 - 扩展阶乘范围:将
fact数组的预计算范围扩大到1000!(可根据题目实际输入上限调整),避免因输入质数过大导致的索引错误。 - 安全遍历列表:直接遍历
vet中的元素,而非使用索引i访问,从根源上避免索引越界问题。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

