【ACM模式的输入输出练习】——python
我们进行机试时,通常都需要自己手动处理输入输出(我已经吃了一次大亏…),与力扣只需要核心代码的形式完全不同。
这篇文章将我遇到的所有输入输出形式进行总结,方便复习。
基本形式
一、从标准输入读取一行字符串
s = input()
这行代码的作用是从标准输入(通常是控制台)读取一行字符串,并将其赋值给变量s
。具体步骤如下:
input()
函数会等待用户在控制台输入一行文本,并按下回车键。s
。例如,如果用户输入hello world
,那么s
的值就是'hello world'
。
二、从标准输入读取多个值并进行处理
a, b = map(int, input().split())
这行代码的作用是从标准输入读取一行包含多个值的字符串,将其分割后转换为整数,并分别赋值给变量a
和b
。具体步骤如下:
input()
函数获取用户输入的一行字符串,比如3 4
。.split()
方法将这行字符串按照空格进行分割,得到一个包含多个子字符串的列表,这里就是['3', '4']
。map(int,...)
将列表中的每个子字符串通过int
函数进行转换,将其从字符串类型转换为整数类型,得到一个可迭代对象,其中包含整数3
和4
。a, b =...
使用多重赋值,将可迭代对象中的第一个值赋值给a
,第二个值赋值给b
。所以这里a
的值为3
,b
的值为4
。三、循环读取多行输入
while True:
try:
line = input()
# 处理每一行输入
#...
except:
break
这段代码用于循环读取多行输入,直到出现异常情况(通常是文件结束或输入错误)。具体步骤如下:
while True:
创建一个无限循环,会一直执行循环体中的代码,直到遇到break
语句。try:
开始一个异常处理块。line = input()
在每次循环中从标准输入读取一行字符串,并将其赋值给变量line
。except:
如果在执行try
块中的代码时发生异常,就会执行这个部分的代码。这里通常是在没有更多输入时(比如文件结束)跳出循环,break
语句会终止while
循环。四、输出单个值或多个值
print(1)
print('hello', 2)
print(1)
会将整数1
输出到标准输出(通常是控制台)。print('hello', 2)
会将字符串'hello'
和整数2
输出到标准输出,多个值之间会用空格自动分隔开,所以输出结果为hello 2
。真题演练
这部分的内容主要参考卡尔哥,感谢卡尔哥!
1.1 A+B问题I——逐行输出
一、题目描述
这道题要求计算一系列输入的两个整数的和。输入包含多行,每行有两个整数,用空格隔开。对于每一行输入,需要输出这两个整数的和,且输出结果也每行一个。
二、题目分析
- 输入形式:输入包含多行,每行有两个整数
a
和b
,用空格隔开。 - 输出形式:对于每一行输入,输出一个整数,即
a + b
的结果,每行一个结果。
三、代码实现及解释
while True:
try:
a, b = map(int, input().split())
print(a + b)
except:
break
while True:
创建一个无限循环,以便持续读取输入。try:
开始一个异常处理块。a, b = map(int, input().split())
:从输入中读取一行,用空格分割后将两个值转换为整数分别赋值给 a
和 b
。print(a + b)
:计算 a + b
并输出结果。except:
如果在读取输入时出现异常(通常是到达文件末尾或输入错误),跳出循环。四、输入输出模板总结
对于类似这种逐行读取输入并进行处理的问题,可以使用以下模板:
while True:
try:
# 根据输入格式进行读取和处理
#...
# 输出结果
print(result)
except:
break
在读取和处理部分,根据具体的输入格式进行调整,比如这里是用 map(int, input().split())
读取两个整数。输出部分根据题目要求输出相应的结果。
这里我对 map()
比较陌生:
在 Python 中,map()
是一个内置函数,它将一个函数应用于可迭代对象(如列表、元组等)中的每个元素,并返回一个新的可迭代对象,其中包含函数应用后的结果。
语法:
map(function, iterable,...)
function
:要应用于可迭代对象中每个元素的函数。iterable
:一个或多个可迭代对象。示例用法:
# 定义一个函数,用于将传入的参数加 1
def add_one(x):
return x + 1
numbers = [1, 2, 3, 4, 5]
result = map(add_one, numbers)
# 将结果转换为列表进行输出
print(list(result)) # [2, 3, 4, 5, 6]
在这个例子中,map()
函数将add_one
函数应用于列表numbers
中的每个元素,返回一个新的可迭代对象,其中每个元素都比原来的元素大 1。
如果有多个可迭代对象作为参数传递给map()
,则function
函数必须接受与可迭代对象数量相同的参数。例如:
def add_two_numbers(x, y):
return x + y
numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
result = map(add_two_numbers, numbers1, numbers2)
print(list(result)) # [5, 7, 9]
这里,add_two_numbers
函数接受两个参数,map()
函数将这个函数应用于两个列表中的对应元素,返回一个新的可迭代对象,其中包含两个列表中对应元素的和。
input().split()
以及int
以下是对input().split()
以及int
在这行代码中的作用分析:
一、input().split()
-
input()
: - 作用是从标准输入(通常是控制台)读取一行字符串。例如,用户在控制台输入
3 4
,input()
就会获取到这个字符串'3 4'
。 - 返回值是一个字符串。
-
.split()
: - 这是字符串的方法。对于由
input()
获取到的字符串,.split()
方法会按照指定的分隔符将字符串分割成多个子字符串,并返回一个包含这些子字符串的列表。 - 默认情况下,分隔符是空格。例如,对于输入
'3 4'
,.split()
会将其分割成['3', '4']
这个列表。
二、int
的作用
在a, b = map(int, input().split())
这行代码中,int
的作用是将列表中的每个子字符串转换为整数类型。
-
map(int,...)
: map
函数将第一个参数(这里是int
函数)依次应用于第二个参数(即input().split()
返回的列表中的每个元素)。int
函数尝试将每个子字符串转换为整数。例如,对于子字符串'3'
和'4'
,int
函数会将它们分别转换为整数 3 和 4。map
函数返回一个可迭代对象,其中包含转换后的整数。-
a, b =...
: - 使用多重赋值,将可迭代对象中的第一个值赋值给
a
,第二个值赋值给b
。所以如果输入是3 4
,最终a
的值为 3,b
的值为 4。
2. A+B问题II——N行输入输出
题目描述
输入描述
输出描述
输入示例
2
2 4
9 21
输出示例
6
30
提示信息
一、题目描述
本题要求计算多组整数的和。首先输入一个整数N
,代表后续有N
行,每一行包含两个整数a
和b
,用空格隔开。对于每一组输入的a
和b
,需要输出它们的和,且输出结果对应每一组输入分别占一行。这个过程会持续进行,不只是一组测试数据。
二、输入输出形式分析
- 输入形式:
- 首先输入一个整数
N
。 - 接着输入
N
行数据,每行有两个整数a
和b
,用空格隔开。 - 然后会再次输入一个新的整数
N
,接着又是N
行相应的数据,如此循环。 - 输出形式:
- 对于每一组输入的
a
和b
,输出它们的和,结果每行一个。
三、代码实现及解释
while True:
try:
N = int(input())
for _ in range(N):
a, b = map(int, input().split())
print(a + b)
except:
break
while True:
创建一个无限循环,以便持续处理输入。try:
开始一个异常处理块。N = int(input())
:从输入中读取一个整数N
,表示后续数据的组数。for _ in range(N):
这是一个循环,会循环N
次,每次处理一组数据。a, b = map(int, input().split())
:在每次循环中,从输入中读取一行,用空格分割后将两个值转换为整数分别赋值给a
和b
。print(a + b)
:计算a + b
并输出结果。except:
如果在读取输入时出现异常(通常是到达文件末尾或输入错误),跳出循环。四、输入输出模板总结及重点
模板:
while True:
try:
# 读取表示数据组数的整数
N = int(input())
for _ in range(N):
# 根据输入格式进行读取和处理每组数据
#...
# 输出结果
print(result)
except:
break
重点:
3. A+B——逐行输出&特定条件结束
一、题目描述
在这个任务中,你的使命依旧是计算两个数的和,即 a + b
。
输入的形式为每行包含一对整数 a
和 b
。当出现一对 0
和 0
时,标志着输入的结束,并且这一对无需进行计算。
输出的要求是对于每一对非 0
和 0
的整数对,在相应的行输出它们的和。例如,第二对 a
和 b
的和应输出在第二行。
二、输入输出形式分析
- 输入形式:
- 输入由多行组成,每行有两个整数
a
和b
,二者之间用空格分隔。 - 当输入为
0 0
时,意味着输入终止。且这一行不要计算! - 输出形式:
- 对于每一对非结束标志的整数对,在对应的行输出它们的和,结果每行一个。
输入示例
输出示例
三、代码实现及解释
while True:
line = input()
a, b = map(int, line.split())
if a == 0 and b == 0:
break
print(a + b)
while True:
创建一个无限循环,以便持续处理输入。line = input()
:从输入中读取一行字符串。a, b = map(int, line.split())
:将读取的字符串用空格分割后转换为两个整数分别赋值给a
和b
。if a == 0 and b == 0:
:判断如果输入为0 0
,则跳出循环。print(a + b)
:计算非0 0
整数对的和并输出结果。四、输入输出模板总结及重点
模板:
while True:
# 读取一行输入
line = input()
# 根据输入格式进行处理和判断是否结束输入
if end_condition:
break
# 进行计算和输出结果
print(result)
重点:
4. A+B问题VI——逐行输出&行内处理&特定条件结束
一、题目描述
本题要求计算若干整数的和。输入的每一行以一个整数N
开始,后面跟着N
个整数。当N = 0
时,表示输入结束,且这一行不需要进行计算。对于每一行非结束标志的输入,需要在相应的行输出这N
个整数的和。
二、输入输出形式分析
- 输入形式:
- 输入由多行组成。
- 每行以一个整数
N
开头,表示后面有N
个整数。 - 当出现
N = 0
时,输入结束。 - 输出形式:
- 对于每一行非结束标志的输入,在相应的行输出这
N
个整数的和。
三、代码实现及解释
while True:
line = input()
nums = list(map(int, line.split()))
n = nums[0]
if n == 0:
break
s = sum(nums[1:])
print(s)
while True:
创建一个无限循环,以便持续处理输入。line = input()
:从输入中读取一行字符串。nums = list(map(int, line.split()))
:将读取的字符串用空格分割后转换为整数列表。n = nums[0]
:提取出每行的第一个数,表示后面整数的个数。if n == 0:
:判断如果第一个数为0
,则跳出循环。s = sum(nums[1:])
:计算除第一个数之外的整数之和。print(s)
:输出这一行整数的和。四、输入输出模板总结及重点
模板:
while True:
# 读取一行输入并处理为整数列表
nums = list(map(int, input().split()))
# 提取第一个数判断是否结束输入
n = nums[0]
if n == 0:
break
# 计算并输出结果
print(sum(nums[1:]))
重点:
A+B问题VII——空格行处理
一、题目描述
本题的任务是计算多组两个整数的和。输入由若干行组成,每行包含两个整数 a
和 b
,用空格分隔。对于每一组输入的 a
和 b
,需要输出它们的和,并且在每行输出结果后接着一个空行。
二、输入输出形式分析
- 输入形式:
- 输入包含多行,每行有两个整数
a
和b
,用空格隔开。 - 输出形式:
- 对于每一组输入的
a
和b
,输出它们的和,结果每行一个,并且在每行输出结果后接着一个空行。
三、代码实现及解释
while True:
try:
a, b = map(int, input().split())
print(a + b)
print()
except:
break
while True:
创建一个无限循环,以便持续处理输入。try:
开始一个异常处理块。a, b = map(int, input().split())
:从输入中读取一行,用空格分割后将两个值转换为整数分别赋值给 a
和 b
。print(a + b)
:计算 a + b
并输出结果。print()
:输出一个空行。except:
如果在读取输入时出现异常(通常是到达文件末尾或输入错误),跳出循环。四、输入输出模板总结及重点
模板:
while True:
try:
# 根据输入格式进行读取和处理
#...
# 输出结果
print(result)
print()
except:
break
重点:
print()
。6. A+B 问题VIII——大缝合
一、题目描述
本题的任务是计算若干组整数的和。首先输入一个整数N
,表示接下来有N
组数据。每组数据中,第一行为一个整数M
,接着在同一行内输入M
个整数。需要输出每组数据中M
个整数的和,每组输出之间输出一个空行。
二、输入输出形式分析
- 输入形式:
- 第一行输入一个整数
N
。 - 接下来有
N
组数据,每组数据的第一行为一个整数M
,然后在同一行内输入M
个整数。 - 输出形式:
- 对于每组数据,输出
M
个整数的和。 - 每组输出之间输出一个空行。
三、代码实现及解释
while True:
try:
n = int(input())
for _ in range(n):
line = list(map(int, input().split()))
m = line[0]
nums = line[1:]
s = sum(nums)
print(s)
print()
except:
break
以上代码显然是错误的!!
输入示例
3
4 1 2 3 4
5 1 2 3 4 5
3 1 2 3
输出示例
10
15
6(到此为止,没有下一行了!上面代码不满足)
提示信息
注意以上样例为一组测试数据,后端判题会有很多组测试数据,也就是会有多个N的输入
例如输入可以是:
3
4 1 2 3 4
5 1 2 3 4 5
3 1 2 3
3
4 1 2 3 4
5 1 2 3 4 5
3 1 2 3
输出则是
10
15
6#(这里是关键)
10
15
6
只保证每组数据间是有空行的。但两组数据并没有空行
每组数据间有空行,但两组数据之间没有空行。
以下是满足要求的代码及分析:
while 1:
try:
n = int(input())
for i in range(n):
line = list(map(int, input().split()))
print(sum(line[1:]))
if i != n-1:
print()
except:
break
/**************************************************************
Problem: 1005
User: odCYZ6qnDLQP5Tip3GOeHpulZ5iw [kamaCoder56559]
Language: Python
Result: 正确
Time:155 ms
Memory:15744 kb
****************************************************************/
分析如下:
以下是对给出代码的分析:
一、题目描述
本题的任务是计算若干组整数的和。首先输入一个整数N
,表示接下来有N
组数据。每组数据中,第一行为一个整数M
,接着在同一行内输入M
个整数。需要输出每组数据中M
个整数的和,每组输出之间输出一个空行。并且后端判题会有很多组测试数据,每组数据间有空行,但两组数据之间没有空行。
二、代码分析
while 1:
try:
n = int(input())
for i in range(n):
line = list(map(int, input().split()))
print(sum(line[1:]))
if i!= n - 1:
print()
except:
break
while 1:
:创建一个无限循环,与while True:
效果相同,会持续处理输入直到遇到异常。try:
:开始异常处理块,用于捕获输入过程中可能出现的错误。n = int(input())
:读取一个整数N
,表示接下来有N
组数据。for i in range(n):
:根据N
的值进行循环,处理每组数据。line = list(map(int, input().split()))
:在每次循环中,读取一行输入并将其转换为整数列表。print(sum(line[1:]))
:计算并输出除第一个整数(表示这组数据的个数)之外的整数之和。if i!= n - 1:
:判断当前是否不是最后一组数据,如果不是最后一组数据,则输出一个空行,以满足每组输出之间有空行的要求。except:
:如果在输入过程中出现异常,跳出循环。
这段代码能够正确地处理输入并输出符合要求的结果,因为它准确地按照题目要求进行了输入读取、数据处理和输出控制。在循环中,正确地处理了每组数据的和的计算以及输出空行的条件判断,从而满足了题目中多组数据输入且每组数据间有空行、两组数据之间没有空行的要求。
重点:
作者:weixin_47868976