Python:显示包含两个整数的所有偶数,并限制代码接受输入的次数

  • 本文关键字:代码 整数 包含两 Python 显示 python
  • 更新时间 :
  • 英文 :


问题链接:https://www.spoj.com/UTPEST22/problems/UTP_Q2/
据我所知,这个问题分为两部分:

  1. 输入
  • 第一个输入是一个整数,它限制了用户可以提供一组整数的时间
  • 从第二行开始,用户提供整数序列,直到指定的极限
  • 这组整数按升序排列,每个整数之间只相隔一个空格
  1. 输出
  • 对于每个整数序列,其中的整数都会循环。只有偶数的才被水平打印为输出
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

有人能提供一些关于如何更改我的代码,特别是循环的见解吗。我觉得自己搞砸了。结果截图。

任何帮助都将不胜感激。

您可以使用将代码重组为以下步骤:

  1. 阅读每个案例。你可以在这里使用输入功能。列表理解可以用于读取每一行,将其拆分为下限和上限,然后将其转换为整数。

  2. 处理每个案例。使用下限和上限可以显示该范围内的偶数。

使用循环:下面是一个与您的尝试类似的示例解决方案:

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(),而不是stdinstdout,以避免像这样的混淆
  • 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=' ')

相关内容

最新更新