Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何用一个for循环和无if条件求奇偶值之和?_Python_Python 3.x - Fatal编程技术网

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}')