Python无终止标识时如何接收不定量多行输入完成区间素数计算
Python区间素数查询多组输入实现优化
需求梳理
- 核心功能:接收整数m、n,返回闭区间
[m, n]内所有素数,素数仅能被1和自身整除 - 输入规则:测试用例包含若干行输入,每行是空格分隔的两个递增整数对;输入行数不固定,无明确终止标识,持续调用
input()读到输入末尾时会触发EOFError,最后一行仍为合法整数对,末尾无空字符串 - 输出规则:每行输出对应当前输入行的结果,区间内素数按升序排列,用空格分隔
原有实现参考
你目前已经掌握Python基础语法,通过try/except捕获异常的方式实现了需求,现有两个版本代码如下:
单组输入处理(无异常捕获)
txt=input().split() m=int(txt[0]) n=int(txt[1]) prime=[] for i in range(m,n+1): divisors=[] for x in range(1,i+1): if i%x==0: divisors.append(x) if divisors==[1,i] or divisors==[1]: prime.append(i) print(str(prime).translate(str.maketrans({"[":"","]":"",",":""})))
多组输入try/except实现
ans=[] while True: try: txt=input().split() m=int(txt[0]) n=int(txt[1]) prime=[] for i in range(m,n+1): divisors=[] for x in range(1,i+1): if i%x==0: divisors.append(x) if divisors==[1,i] or divisors==[1]: prime.append(i) ans.append(str(prime).translate(str.maketrans({"[":"","]":"",",":""}))) except: for i in range(len(ans)): print(ans[i]) break
更简洁的优化实现
优化点说明
- 素数判断逻辑简化:原有逻辑需要遍历1到当前数的所有值、存储全部约数再做列表对比,效率低。实际判断素数只需要排除小于2的数,再检查2到数的平方根范围内有没有能整除的因子即可,不需要存储所有约数
- 输入处理简化:直接用拆包+
map转换整数,不需要单独取列表索引赋值 - 输出逻辑简化:不需要提前把所有结果存到列表最后统一打印,读一行处理一行直接输出即可;用字符串
join方法直接生成空格分隔的结果,比手动替换列表字符串的括号、逗号更直观 - 异常捕获更精准:只捕获输入结束触发的
EOFError,不会误吞其他运行错误,方便调试
优化后代码
import math def is_prime(num): if num < 2: return False for i in range(2, int(math.sqrt(num)) + 1): if num % i == 0: return False return True while True: try: m, n = map(int, input().split()) res = [str(i) for i in range(m, n + 1) if is_prime(i)] print(' '.join(res)) except EOFError: break
这个写法完全符合基础语法范畴,没有用到超纲特性,运行效率比原有实现高很多,代码行数也更短,可读性更好。
内容的提问来源于stack exchange,提问作者minyards
相关产品推荐
相关产品推荐

