Python 如何用一个for循环和无if条件求奇偶值之和?
我在大学上编程课,问题单中的一个练习是编写以下代码:Python 如何用一个for循环和无if条件求奇偶值之和?,python,python-3.x,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) 只使用一个“for”循环,不使用“while”或“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 n in range(number):
x += (1 - n % 2) * n
y += (n % 2) * n
输出:
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切片的链接
- 只需使用
函数即可获得总和sum()
for n in range(number):
x += (n,0)[n%2]
y += (0,n)[n%2]
您要求一个只有一个循环的解决方案,但是一个没有循环的解决方案怎么样 从
1
到n
的数字之和是(n+1)*n/2
。因此,偶数之和为2*(m+1)*m/2
,其中m=n//2
(即楼层(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的数的和,前n个数的和为n(n+1)/2(数学推导)。如果我们知道n的值,那么我们可以找到从1到n的所有数字的和
如果我们找到n之前所有奇数的和,并将其从前n的和中减去,我们得到n之前所有偶数的和
代码如下:
n = int(input("Enter a number: "))
odd = 0
for i in range(1,n+1,2):
odd += i
even = int(n*(n+1)/2) - odd
print("even:",even,"odd:",odd)
我认为你是个初学者。我不想让您对复杂的实现感到困惑 如您所述 代码的目的是求偶数和的和 从零到输入的数字的奇数,并打印到 屏幕 无需找到初始数字为奇数/偶数 如果要在计算偶数/奇数和时包含输入数,则程序是错误的 示例 输入 五, 预期产出 六, 九, 解释 偶数和:2+4=6 奇数和:1+3+5=9 您的输出 6.4(输出错误) range()函数将排除该数字。当输入为5时,它将仅从0迭代到4。因此,如果要包含5,则应在将其传递到range()函数时,将1添加到数字中
number = int(input())
x = 0
y = 0
for n in range(number+1):
x += (1 - n % 2) * n #this will add 0 if not even
y += (n % 2) * n #this will add 0 if not odd
print(x)
print(y)
如果我们被允许使用numpy,这是我的建议
import numpy as np
number = int(input())
l = np.array(range(number))
print('odd:',sum(l % 2 * l))
print('even:', sum((1- l % 2) * l))
还有一种数学方法:
num = int(input("Enter number:"))
odd = ((num+1)/2)**2
even = num*(num+1)/2 - odd
前n个奇数之和为n^2。要获得奇数的计数,我们使用
(num+1)/2
。为了得到偶数之和,我们可以使用类似的方法,但我更喜欢从前n个数的和中减去奇数,即n*(n+1)/2。如果允许使用列表的话
number = int( input() )
counts = [ 0, 0 ]
for n in range( number ):
counts[ n % 2 ] += n
print( counts[ 0 ] )
print( counts[ 1 ] )
还有另一种方法,根据模2的余数,将for循环中的奇数和偶数索引相加:
number = int(input())
odd = 0
even = 0
for i in range(len(number)):
odd += i * (i % 2)
even += i * ((i + 1) % 2)
print (odd, even)
这使用了列表理解和新的Python赋值运算符。您能与我们分享您到目前为止一直在尝试的内容吗?以及您到底遇到了什么困难?谢谢。你对这个问题的措辞有点奇怪——你强调“只使用一个for循环”,但只是在括号中提到no if语句。但是您的代码片段已经只有一个for循环,因此避免使用if语句不仅仅是一个脚注,而是一个要点。我读了好几遍你的问题,才注意到全部要求。@Arthurtaca你是绝对正确的,在我发布后,我注意到,正如你所说,它的全部目的是消除if语句,我之所以这样写,是因为这是题单中练习的措辞,如果上界是偶数,这将失败。如果
number
是3
则y
的输出是0
。虽然这不太有效,但我确实认为它最接近于捕捉原始问题的精神。它不只是使用数学公式(显然在现实世界中这是最好的解决方案,但不是这里的重点),也不使用任何技巧来模拟if语句。遗憾的是,这个问题不允许循环外的一个if语句整理奇偶最大数之间的差异。这正是我所做的,但当我尝试对偶数进行处理时,它再次失败了,如果我纠正它使偶数正确,那么奇数中的错误就会出现,但作为@Arthurtaca,这正是我写这个问题时的想法。这既有趣又聪明,但我看到其中有五个循环:list
、两个切片和两个sum
调用。(我没有计算前两次print
调用中呈现字符串的循环数。)
number = int( input() )
counts = [ 0, 0 ]
for n in range( number ):
counts[ n % 2 ] += n
print( counts[ 0 ] )
print( counts[ 1 ] )
number = int(input())
odd = 0
even = 0
for i in range(len(number)):
odd += i * (i % 2)
even += i * ((i + 1) % 2)
print (odd, even)
number = 1000000
x = 0
y = 0
[(x:=x+n, y:=y+(n+1)) for n in range(0,number,2)]
print(f'{x}, {y}')