给定:两个正整数 a 和 b (a
返回:从 a 到 b 的所有奇数的总和,包括在内。
#My code:
a = 100
b = 200
for i in range(a,b):
if i%2 == 1:
print i
目前它只是显示所有奇数的下拉列表。如果需要,我不知道如何正确地为此加上“范围”。如何添加到上面的代码中以获得所有奇数的总和?
谢谢
将所有介于a
和之间的数字相加,b
如果是奇数。
sum(i for i in xrange(a, b) if i%2)
一个相当快速的方法是:
result = 0
for i in range(a,b+1):
if i%2 == 1:
result += i
print result
有很多方法可以做到这一点。但是,如果您考虑数学,它很像高斯的老问题。高斯被要求将 1 到 100 之间的数字相加,他意识到每对高低值之和为 101(100 + 1、99 + 2、98 + 3……)
high = b
low = a
所以我们必须乘以一些b + a
值。那里有多少?对于所有整数,这只是
num_pairs = (high-low) // 2
然后我们将这个数字乘以high + low
得到答案:
result = (high + low) * num_pairs
但是你只想要其他的,所以我们再次除以二:
result //= 2
完全:
def sumrange(low, high, step):
num_pairs = (high - low) // 2
result = (high + low) * num_pairs
return result // step
或者sumrange = lambda low, high, step: (high - low) * (high + low) // (2 * step)
现在这仍然不能完全回答您的问题,因为它需要根据您的低值是否为奇数以及您的高值是否包含或排除来抵消。但我会把它留作练习。
将此作为 CW 答案,以便在我的数学混乱时有人可以编辑。
一些数学技巧可以非常有效地解决您的问题。
例如,前 n 个奇数之和 = n*n square(n)
所以你可以使用
奇数之和 [m,n] = n*n - (m-2)*(m-2)
where m!=1
和m and n are odds
一种更有用的分析是,AP(算术级数)
公式:(n/2)*(a+l)
where n= no. of elements, a = first term, l= last term
这里,
a = m [如果 m 是奇数]
a = m+1 [如果 m 是偶数]
l = n [如果 n 是奇数]
l = n-1 [如果 n 是偶数]
n = ( ( l - a ) / 2 ) + 1
通过在代码中应用,您可以轻松获得答案...
以及解决方案的numpy版本:
import numpy as np
a = 100
b = 200
r = np.linspace(a,b-1,b-a)
r = np.sum(np.mod(r,2)*r)
print(r)