当前位置: 首页 > news >正文

oj第一题python解法

用pyhon实现自动识别输入截止功能

一、 序言与题目引入

对于新接触编程语言如python和c的新同学来说,学校的oj平台上有很好配套练习,既有一定难度,又不会像LeetCode等程序员公用的成熟平台那样太难上手,不过学长学姐们在设计题目时为了增加趣味(或者恶趣味?),第一题的解答需要额外学一个知识点。
接下来看题:

image

初看这题只是简单的加减,如果我们直接上手解答,可以得到这些代码(python):
image

当然我们看到有部分代码功能重复,显得有些冗余,或许可以尝试优化成函数形式,并用map代替原有列表:
image
其实这个时候已经初见端倪了,输出要输出两遍呢,题目有说要输出几遍吗?暂且按下疑问,我们试运营看看
image
哎呀,果然出问题了,我们再细看要求,它说的是需要输入的一系列a和b对,也就是n对(a,b),但n却是未知数,我们并不知道输入的人会输入几对(a,b),也许是一对,也许像测试样例一样是两对,但也有可能是更多对。
这个时候很多人可能会想到循环,诶我循环读取不就好了吗,可以读取更多对数,但是循环的终止条件又该怎么设置呢?总不能让它一直循环,那就是死循环了,但如果设置了具体的数,那也还是预判了要输入的对数
所以遇到这样非固定的输入到底该怎么办呢?

二、 解题过程

2.1 用c语言解决

先注意看学长学姐们留下的小Tips——‘查查EOF’,哦?EOF又是什么呢?,我们来详细看看

(1)EOF定义

通过查询资料,我们可以了解到:
在编程中,EOF,即End of File,为文件结束符,它是一个标记,用于表示输入流(如文件、标准输入、管道等)的结束,它并非一个实际的字符,而是输入设备或系统在数据读取完毕后返回的 “终止信号”。
而在C语言中,EOF是一个预定义的宏(通常定义为-1),用于标记输入流的结束。大多数输入函数(如getchar()、fgets()、fscanf()等)会通过返回特定值来表示 “已读取到 EOF”。

(2)用c语言实操

简单来说,当系统在读取我们的输入时,只要捕捉到EOF这个终止信号,就会停止读取,这样说,只要我们在循环的过程中加入这个信号不就行了,如果一直没捕捉到就可以一直输入,输入结束后加入这个信号就能示意输入结束了,岂不是完美符合我们的要求。那么究竟可不可以呢,也得要我们来试试(记得切换成c语言):
image
可以看到我们将循环条件改成了只要没捕捉到终止信号就一直输入,结果是正确的。

tips:

这里值得一提的是,代码中的终止信号也就是EOF,在实际操作中发出与正常结束的回车不同,在本题不需要答题者实操,仅作了解,以下是两个系统的发送信号终止的操作:
Linux/macOS:在命令行输入时,按 Ctrl+D(直接按,无需额外回车),系统会向程序发送 “EOF 信号”,表示输入流结束。
Windows:在命令行输入时,按 Ctrl+Z,然后按回车,系统发送 EOF 信号。

2.2 用Python解决

虽然我们用EOF成功解决了这道题,但那是基于C语言解决的,如我一样常用python的人难道就解不了这道题吗?这自然是不可能的,直接的EOF用法只存于C语言,但类似的逻辑在大部分编程语言中都是存在的。
在python语言中没有像C语言那样的EOF宏,但可以通过异常捕获迭代器特性来检测输入流的结束,其效果与C的EOF机制一致。

2.2.1 异常捕获

用input()+eoferror:input()函数用于读取一行输入(默认从标准输入stdin读取),当读取到 EOF 时会抛出EOFError异常,通过捕获该异常即可检测输入终止。
原理:
input()本质是从sys.stdin读取数据,当sys.stdin中没有更多数据(即 EOF)时,input()无法获取内容,因此抛出EOFError。
image

2.2.2 基于sys.stdin迭代器

sys.stdin是 Python 的标准输入流对象,它本身是一个可迭代对象,迭代时会自动逐行读取数据,直到 EOF 时终止迭代,无需手动处理异常。
原理:
sys.stdin的迭代器会在读取到输入流末尾(EOF)时自动停止,因此for line in sys.stdin循环会自然结束。
tips:sys.stdin读取的每行包含末尾的换行符(\n),需用strip()等方法处理。

image

http://www.rkmt.cn/news/51600.html

相关文章:

  • MySQL 数据库核心操作全解析:从创建到备份与连接管理 - 详解
  • 20232402 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 3种决策树算法
  • 20232326 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 应用安全 --- frida成功的关键 之 时机
  • 用 Rust 实现验证码识别
  • 结合前缀和进行差分数组的学习理解
  • Rust 实现验证码识别
  • 2025 年空运物流公司推荐排行榜(广东地区重点推荐) 广州 / 深圳 / 佛山 / 东莞 ⇄ 澳洲 / 新西兰 / 悉尼 / 新加坡 / 墨尔本 空运专线物流公司推荐
  • [学习笔记] JMM 汇总:从概念到底层原理
  • 2025镇江、常州、无锡、苏州、高邮、濮阳、郑州、嘉兴、扬州物流公司推荐:2025地区物流/仓储/供应链/配送中心企业最新排行,江浙沪区域运输服务口碑榜
  • WireWorld美国线世界中国企业代理资质结构化列表
  • 详细介绍:00x01.Vulnhub系列DC-1靶机渗透测试:从Drupal漏洞到Root权限的完整攻防
  • 完整教程:配置驱动开发:初探零代码构建嵌入式软件配置工具
  • 2025 年海运物流专线公司推荐排行榜(广东地区重点推荐) 广州 / 深圳 / 佛山 / 东莞 ⇄ 澳洲 / 加拿大 / 新西兰物流运输公司推荐
  • 【CSP-J 2025】T4 多边形 polygon 题解
  • 回退背包
  • module jdk.compiler does not “以” com.sun.tools.javac.processing” to unnamed module
  • nginx 响应html内容
  • logicFlow ,画布节点自定义
  • NOIP2025模拟9
  • iOS移动端H5键盘弹出时页面布局异常和滚动解决方案 - 详解
  • 深入解析:Hadoop 集群自动化运维实战
  • PyCharm gitee: Git Pull Failed
  • 【MySQL】实操: 慢SQL优化
  • NCA和fsQCA
  • PyCharm gitee: ignore
  • python方便的桌面应用.customtkinter
  • 全球云服务震荡:Amazon Web Services (AWS) 出现大规模故障 多项线上服务受冲击 - 实践
  • 20232406 2025-2026-1 《网络与系统攻防技术》实验五实验报告