当前位置: 首页 > 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.jsqmd.com/news/42213/

相关文章:

  • 11.16方法
  • 基于Tcl命令的HyperView截图
  • 2025 年 11 月智能吉他厂家推荐排行榜,无弦吉他,自动档吉他,伴奏吉他,MIDI吉他,创新科技与便捷演奏体验之选
  • 团队作业3——需求改进与系统设计
  • 完整教程:Redis(69)Redis分布式锁的优点和缺点是什么?
  • 2025 年 11 月 Q355B/Q345B/16Mn 方钢厂家推荐排行榜,低合金高强度方钢,结构用方钢,建筑用方钢公司推荐
  • 2025 年 11 月精密仪器厂家推荐排行榜,触摸仪表,手表锁具,测试针,医疗传感器,Pogopin声学弹簧公司精选
  • MySQL 数据库核心操作全解析:从创建到备份与连接管理 - 详解
  • evalscope使用2-使用自定义数据集压测
  • 2025 年 11 月摩托车/机车厂家推荐排行榜:街车、跑车、巡航机车、越野摩托车品牌实力与市场口碑深度解析
  • 20232402 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 2025 年 11 月热轧方钢/扁钢厂家推荐排行榜,方钢,扁钢,热轧方钢,热轧扁钢,优质钢材生产公司推荐
  • 2025 年 11 月冷拉/冷拔六角钢厂家推荐排行榜,冷拉六角钢,冷拔六角钢,精密冷拉六角钢,高强度六角钢公司推荐
  • 2025 年 11 月氢氧化镁厂家推荐排行榜,矿石氢氧化镁,水镁石氢氧化镁,阻燃剂氢氧化镁,改性氢氧化镁公司推荐
  • 3种决策树算法
  • (Kotlin高级特性三)Kotlin密封类(Sealed Class)在何时比枚举更适用? - 指南
  • 2025 年 11 月冷拉/冷拔扁钢厂家推荐排行榜,冷拉扁钢,冷拔扁钢,精密冷拉扁钢,高强度冷拔扁钢公司推荐
  • 20232309 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • CIO的能力
  • 20232326 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • LangChain4j实战-工具(函数调用)Tools(Function Calling)
  • 应用安全 --- frida成功的关键 之 时机
  • 小米路由器通过电脑使用手机usb共享网络联网教程
  • 第27天(简单题中等题 二分查找)
  • 题解:P14452 [ICPC 2025 Xian R] Follow the Penguins
  • Atcoder 432 A-F 总结+题解
  • 用 Rust 实现验证码识别
  • 结合前缀和进行差分数组的学习理解
  • Rust 实现验证码识别
  • 高安全性 PHP 2FA 开发指南:Authenticator 扫码验证实现方案