问题链接:https://www.spoj.com/UTPEST22/problems/UTP_Q2/
据我所知,这个问题分为两部分:
- 输入
- 第一个输入是一个整数,它限制了用户可以提供一组整数的时间
- 从第二行开始,用户提供整数序列,直到指定的极限
- 这组整数按升序排列,每个整数之间只相隔一个空格
- 输出
- 对于每个整数序列,其中的整数都会循环。只有偶数的才被水平打印为输出
from sys import stdin
for x in range(1, 1+ int(input())):
# number of cases, number of times the user is allowed to provide input
for line in stdin:
num_list = line.split()
# remove the space in between the integers
num = [eval(i) for i in num_list]
# change the list of numbers into integers each
for numbers in range(num[0], num[-1] + 1):
# the first integer is the lower bound
# the second the upper bound
if numbers % 2 == 0:
# modulo operation to check whether are the integers fully divisible
print(numbers, end = ' ')
# print only the even numbers, horizantally
有人能提供一些关于如何更改我的代码,特别是循环的见解吗。我觉得自己搞砸了。结果截图。
任何帮助都将不胜感激。
您可以使用将代码重组为以下步骤:
-
阅读每个案例。你可以在这里使用输入功能。列表理解可以用于读取每一行,将其拆分为下限和上限,然后将其转换为整数。
-
处理每个案例。使用下限和上限可以显示该范围内的偶数。
使用循环:下面是一个与您的尝试类似的示例解决方案:
n = int(input())
cases = []
for case in range(n):
cases.append([int(x) for x in input().split()])
for case in cases:
for val in range(case[0], case[1] + 1):
if val % 2 == 0:
print(val, end=' ')
print()
这将产生以下所需的输出:
4 6 8 10 12 14 16 18 20
2 4 6 8 10 12 14 16
-4 -2 0 2 4 6
100 102 104 106 108
使用拆包简化:您可以通过拆包range
来进一步简化。你可以在这里了解更多关于开箱的信息。
n = int(input())
cases = []
for case in range(n):
cases.append([int(x) for x in input().split()])
for case in cases:
lower = case[0] if case[0] % 2 == 0 else case[0]
print(*range(lower, case[1] + 1, 2))
使用逐位运算符简化:您可以使用逐位&
运算符进一步简化。您可以在此处了解有关此操作员的更多信息。
n = int(input())
cases = []
for case in range(n):
cases.append([int(x) for x in input().split()])
for case in cases:
print(*range(case[0] + (case[0] & 1), case[1] + 1, 2))
因此,首先显然需要用户输入范围,无论他们指定了多少次,您可以只split
输入,然后只获得split
将返回的列表的第一个和第二个项目,通过元组拆包,然后将用户输入的范围作为Pythonrange
对象附加到范围列表中,这样您以后就可以更容易地对其进行迭代。
输入完所有内容后,在ranges
列表上迭代,然后在每个范围上迭代,只打印出偶数,然后再次调用print
,移动到控制台中的新行并完成。
ranges = []
for _ in range(int(input())):
start, end = input().split()
ranges.append(range(int(start), int(end) + 1))
for r in ranges:
for number in r:
if number % 2 == 0:
print(number, end="")
print()
这是我的解决方案:
n = int(input())
my_list = []
for i in range(n):
new_line = input().split()
new_line = [int(x) for x in new_line]
my_list.append(new_line)
for i in my_list:
new_string = ""
for j in range(i[0], i[1]+1):
if (not(j % 2)): new_string += f"{j} "
print(new_string)
使用input()从stdin读取第一个值。转换为整数,并基于该值为创建循环。
使用input()从stdin读取一行。假设每行将有两个以空格分隔的标记,每个标记表示一个整数。
这给了我们:
N = int(input()) # number of inputs
for _ in range(N):
line = input()
lo, hi = map(int, line.split())
print(*range(lo+(lo&1), hi+1, 2))
这里有一些问题,但我猜这就是发生的事情:你运行代码,输入前两行输入(4,然后是3 20),代码没有打印任何内容,所以你再次按enter键,然后打印结果,但你也会收到错误。
以下是实际发生的情况:你输入了输入,程序会按照你的期望打印所有内容,但你看不到。因为出于某种原因,当你使用sys.stdin
然后在没有新行的情况下打印时,stdout
不会刷新。我发现了类似的问题(在Python-3中执行打印("Enter text:",end=")sys.stdin.readline()无法正常工作)。
然后,当您再次点击Enter时,您基本上是在向程序发送一个新的输入行,其中不包含任何内容(相当于""
的字符串)。然后你尝试split
这个字符串,这很好(它只会给你一个空列表),然后尝试通过调用num[0]
来获取该列表的第一个元素,但列表中没有元素,所以它会引发你看到的错误。
因此,可以通过将打印语句更改为print(numbers, end = ' ', flush=True)
来解决该问题。这将迫使Python向您显示您在终端中打印的内容。但是,如果您仍然尝试输入并发送更多空行,您仍然会收到相同的错误。您可以通过在for循环中放入if并检查if line == ""
来解决此问题,然后什么也不做。
不过,您的程序仍然存在问题。您不会在每一行输出后打印新行。打印所有的数字,然后转到换行处,打印下一行输入的答案。这可以通过将CCD_ 15放置在for循环CCD_。
这就引出了这个答案中更重要的部分:你怎么能自己解决这个问题方法如下:将日志放入代码中。在解决SPOJ、Codeforces等问题时,这一点尤为重要。因此,当你的程序正在做这种奇怪的事情时,你应该做的第一件事是在错误行之前打印变量,看看它们的值是多少。这可能会给你一个线索。同样重要的是:当你的程序没有向你显示你的输出,而你出于困惑再次按下Enter键时,你应该好奇它为什么没有打印出来。因为根据你的程序逻辑,它应该打印出来;所以已经出现了问题。
最后还有一些旁注:
- 我不会那样使用
eval
。你想要的是int
而不是eval
,它以同样的方式工作只是偶然的 - 我们通常把评论放在上面而不是下面
- 由于您似乎正在进行竞争性编程,我建议使用
input()
和print()
,而不是stdin
和stdout
,以避免像这样的混淆 - SPOJ和其他竞争性编程网站完全独立于输出读取stdout。这意味着,如果您忘记放置空的
print()
语句,并且不打印新行,那么您的程序在您的终端中看起来会很好,因为您会在输入下一行之前按Enter键,但实际上,您正在将新行发送到stdin
,而SPOJ将只读取没有新行的stdout
部分。我建议在没有新行的情况下提交这段代码,看看我的意思,然后添加新行 - 在我看来,变量
numbers
在您的代码中没有一个好名字。numbers
表示一个值列表,但它只包含一个数字 - 你的第一个如果不需要从1开始到数字,是吗?它只需要迭代那么多次,所以您还可以为自己保存一些代码并编写
range(int(input()))
- 在相同的for循环中,您并不真正关心变量
x
的值——它只是一个计数器。在这些情况下,标准做法是将_
作为变量。这意味着这个变量的值其实并不重要,它只是一个计数器。所以它看起来是这样的:for _ in range(int(input()))
我知道其中一些确实超出了你的要求,但我认为你正在学习编程,并试图参加比赛,所以想再给一些建议。我希望它能有所帮助。
简单解决方案的步骤
# taking input (number of rows) inside outer loop
# l = lower limit, u = upper limit, taking from user, then converting into integer using map function
# applying logic for even number
# finally printing the even number in single line
for j in range(int(input())):
l, u = map(int, input('lower limit , upper limit').split())
for i in range(l, u+1):
if i%2 == 0: # logic for even number
print(i, end=' ')