如何用一个 for 循环而不是 if 条件来求和偶数和奇数?

Rui*_*ito 25 python python-3.x

我正在大学上一门编程课,问题表中的一个练习是编写以下代码:

number = int(input())
x = 0
y = 0
for n in range(number):
    if n % 2 == 0:
        x += n
    else:
        y += n
print(x)
print(y)
Run Code Online (Sandbox Code Playgroud)

只使用一个“for”循环,不使用“while”或“if”。

该代码的目的是找出从零到输入的数字的偶数和奇数之和并将其打印到屏幕上。

请注意,此时我们不应该了解函数。

我已经尝试了很长时间,似乎无法找到一种不使用“if”语句来知道循环变量是偶数还是奇数的方法。

S3D*_*DEV 17

纯粹出于教育目的(还有一点乐趣),这里有一个根本不使用任何for循环的解决方案。(当然,在函数的底层逻辑中,至少有五个循环。)

num = list(range(int(input('Enter number: '))))

even = num[::2]
odd = num[1::2]

print('Even list:', even)
print('Odd list:', odd)

print('Even:', sum(even))
print('Odd:', sum(odd))
Run Code Online (Sandbox Code Playgroud)

输出:

Enter number: 10
Even list: [0, 2, 4, 6, 8]
Odd list: [1, 3, 5, 7, 9]
Even: 20
Odd: 25
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

  • input()函数返回一个str对象,该对象使用该int()函数转换为整数。
  • 整数包含在range()list()函数中,用于将给定数字转换为该范围内的值列表。
    • 这是您在 Python 职业生涯中会经常使用/看到的约定。
  • 列表切片用于获取列表中的每第二个元素。鉴于列表以零为基础,这些将是偶数。
  • 再次切片相同的列表,从第二个元素开始,并获取每隔一个元素......奇数。
  • 只需使用该sum()函数即可获得总和。

  • 这既有趣又聪明,但我看到其中有“五个”循环:“list”、两个切片和两个“sum”调用。(我没有计算前两个“print”调用中渲染字符串的循环。) (2认同)

del*_*lta 13

for n in range(number):
    x += (1 - n % 2) * n
    y += (n % 2) * n
Run Code Online (Sandbox Code Playgroud)


tob*_*s_k 11

您要求一个循环的解决方案,但是没有循环的解决方案怎么样?

这是众所周知的是,数字从和1n(n+1)*n/2。因此,总和偶数号码是2 * (m+1)*m/2m = n//2(即,floor(n/2))。奇数之和可以通过所有数字之和减去偶数之和来计算。

n = 12345
m = n // 2
e = (m+1)*m
o = (n+1)*n//2 - e
Run Code Online (Sandbox Code Playgroud)

确认:

>>> e, e==sum(i for i in range(n+1) if i % 2 == 0)
38112102 True
>>> o, o==sum(i for i in range(n+1) if i % 2 == 1)
38105929 True
Run Code Online (Sandbox Code Playgroud)

注意:这将计算数字的总和,包括 n


Tuq*_*qay 6

还有数学的方法:

num = int(input("Enter number:"))
odd = ((num+1)/2)**2
even = num*(num+1)/2 - odd
Run Code Online (Sandbox Code Playgroud)

前n个奇数之和为n^2。为了获得奇数的计数,我们使用(num+1)/2. 要获得偶数之和,我们可以使用类似的方法,但我更喜欢odd从前 n 个数字的总和中减去,即 n*(n+1)/2。