You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:06:31