如何用一个for循环而不是if条件来求和偶数和奇数?
我正在大学上一门编程课,问题表中的一个练习是编写以下代码:
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)
只使用一个“for”循环,不使用“while”或“if”。
该代码的目的是找出从零到输入的数字的偶数和奇数之和并将其打印到屏幕上。
请注意,此时我们不应该了解函数。
我已经尝试了很长时间,似乎无法找到一种不使用“if”语句来知道循环变量是偶数还是奇数的方法。
回答
纯粹出于教育目的(还有一点乐趣),这里有一个根本不使用任何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))
输出:
Enter number: 10
Even list: [0, 2, 4, 6, 8]
Odd list: [1, 3, 5, 7, 9]
Even: 20
Odd: 25
它是如何工作的?
- 该
input()函数返回一个str对象,该对象使用该int()函数转换为整数。 - 整数包含在
range()和list()函数中,用于将给定数字转换为该范围内的值列表。- 这是您在 Python 职业生涯中会经常使用/看到的约定。
- 列表切片用于获取列表中的每第二个元素。鉴于列表以零为基础,这些将是偶数。
- 再次切片相同的列表,从第二个元素开始,并获取每隔一个元素......奇数。
- 链接到关于 Python 切片的一个很好的 SO 答案。
- 只需使用该
sum()函数即可获得总和。
- That is fun and clever, but I see *five* loops in it: `list`, the two slices, and the two `sum` calls. (I'm not counting the loops to render the strings in the first two `print` calls.)
回答
for n in range(number):
x += (1 - n % 2) * n
y += (n % 2) * n
回答
您要求一个循环的解决方案,但是没有循环的解决方案怎么样?
这是众所周知的是,数字从和1到n是(n+1)*n/2。因此,总和偶数号码是2 * (m+1)*m/2与m = n//2(即,floor(n/2))。奇数之和可以通过所有数字之和减去偶数之和来计算。
n = 12345
m = n // 2
e = (m+1)*m
o = (n+1)*n//2 - e
确认:
>>> 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
注意:这将计算数字的总和,包括 n。