Python 输入输出练习 (ACM 模式)
发布于 2025-09-21
|
更新于
2025-12-25
|
字数:1194
有些笔试或面试是 ACM 模式,需要自己处理题目的输入与输出,因此需要掌握 Python 中常见的读取输入的写法。
以牛客上的这个题单为例:输入输出练习
只有输出
1
|
print("Hello Nowcoder!")
|
单组_A+B
使用 input() 读取一个整行字符串:"10 20"
使用 split() 将输入的字符串按照空格拆分,得到一个列表:["10", "20"]
使用 map() 对列表里的每个元素应用 int(),把字符串转换为整数,返回可迭代对象(非列表):[10, 20]
使用 a, b 序列解包,把返回对象分别赋值给 a 和 b:a = 10,b = 20
1
2
|
a, b = map(int, input().split())
print(a + b)
|
多组_A+B_EOF形式
当读到文件末尾,再调用 input() 时就会抛出 EOFError 异常,这时就会跳出循环。
1
2
3
4
5
6
|
while True:
try:
a, b = map(int, input().split())
print(a + b)
except EOFError:
break
|
如果输入数据量很大,sys.stdin 的写法效率会更高一些:
1
2
3
4
5
|
import sys
for line in sys.stdin:
a, b = map(int, line.split())
print(a + b)
|
多组_A+B_T组形式
先读取输入组的数量(t),然后使用 range() 控制循环次数。
1
2
3
4
|
t = int(input())
for i in range(t):
a, b = map(int, input().split())
print(a + b)
|
多组_A+B_零尾模式
1
2
3
4
5
6
|
while True:
a, b = map(int, input().split())
if a | b:
print(a + b)
else:
break
|
单组_一维数组
使用 list() 把 map() 转换后的可迭代对象收集到列表中赋给 a
1
2
3
|
n = int(input())
a = list(map(int, input().split()))
print(sum(a))
|
多组_一维数组_T组形式
1
2
3
4
5
|
n = int(input())
for _ in range(n):
s = int(input())
a = list(map(int, input().split()))
print(sum(a))
|
单组_二维数组
1
2
3
4
5
6
|
n, m = map(int, input().split())
s = 0
for _ in range(n):
a = list(map(int, input().split()))
s += sum(a)
print(s)
|
这只是题目解法,但对于一个二维数组的读取,以下写法会更清晰,有一个 matrix 变量保存了整个矩阵
1
2
3
4
5
6
|
n, m = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(n)]
s = 0
for row in matrix:
s += sum(row)
print(s)
|
多组_二维数组_T组形式
1
2
3
4
5
6
7
8
|
t = int(input())
for _ in range(t):
n, m = map(int, input().split())
s = 0
for _ in range(n):
a = list(map(int, input().split()))
s += sum(a)
print(s)
|
单组_字符串
使用 strip() 来去掉可能存在的换行符。(这里的长度 n 在读取输入时没有作用)
1
2
3
|
n = int(input())
s = input().strip()
print(s[::-1])
|
多组_字符串_T组形式
1
2
3
4
5
|
t = int(input())
for _ in range(t):
n = int(input())
s = input().strip()
print(s[::-1])
|
单组_二维字符数组
1
2
3
4
5
|
n, m = map(int, input().split())
matrix = [input().strip() for _ in range(n)]
for row in reversed(matrix): # 倒置行
print(row[::-1]) # 每行倒置列
|
多组_带空格的字符串_T组形式
1
2
3
4
5
6
|
t = int(input())
for _ in range(t):
n = int(input())
s = input().strip()
s = s.replace(" ", "") # 去掉空格
print(s[::-1])
|
单组_保留小数位数
1
2
|
n = float(input())
print(f"{n:.3f}")
|
单组_补充前导零
1
2
|
n = int(input())
print(f"{n:09d}")
|
单组_spj判断YES与NO
1
2
|
n = int(input())
print("YES" if n % 2 == 1 else "NO")
|
单组_spj判断浮点误差
python 的 math 库提供了精确的 π 的值
1
2
3
4
5
|
import math
r = int(input())
area = math.pi * r * r
print(area)
|
单组_spj判断数组之和
1
2
3
4
|
n, m = map(int, input().split())
arr = [1] * n # 初始数组全是 1
arr[0] += m - n # 把差值加到第一个元素
print(" ".join(map(str, arr)))
|
当输入数据大时,使用 sys.stdin.readline 可以起到加速的效果,因为它去除了 input() 中的一些额外处理(比如抛出异常等)。因此可以直接将内置的 input() 修改为 sys.stdin.readline,其余写法保持不变。
1
2
|
import sys
input = sys.stdin.readline
|
实际测试如下,通常会有3倍左右的加速:
| 文件大小 |
input() |
sys.stdin.readline() |
加速比 |
| 2 MB (100000 行,每行字符串长度 20) |
0.040 s |
0.012 s |
3.22x |
| 20 MB(1000000 行,每行字符串长度 20) |
0.289 s |
0.073 s |
3.94x |
| 200 MB(10000000 行,每行字符串长度 20) |
2.400 s |
0.762 s |
3.15x |
测试代码:test.py
本站不记录浏览量,但如果您觉得本内容有帮助,请点个小红心,让我知道您的喜欢。