5

我正在尝试编写一个名为的函数,该函数sum_square_difference接受一个数字 n 并返回前 n 个自然数的平方和与其和的平方之间的差。

我想我知道如何编写一个定义平方和的函数

def sum_of_squares(numbers):
    total = 0
    for num in numbers:
        total += (num ** 2)
    return(total)

我试图实现平方和函数:

def square_sum(numbers):  
    total = 0
    for each in range: 
        total = total + each
    return total**2

我不知道如何组合函数来区分,我不知道我的函数是否正确。

请问有什么建议吗?我正在使用 Python 3.3

谢谢你。

4

5 回答 5

11

该函数可以用纯数学编写,如下所示:

公式

翻译成 Python:

def square_sum_difference(n):
    return int((3*n**2 + 2*n) * (1 - n**2) / 12)

该公式是其他两个公式的简化:

def square_sum_difference(n):
    return int(n*(n+1)*(2*n+1)/6 - (n*(n+1)/2)**2)

n*(n+1)*(2*n+1)/6是这里描述的公式,它返回第一个n自然数的平方和。

(n*(n+1)/2))**2使用三角形数公式,它是第一个n自然数的和,然后是平方。


这也可以通过内置sum函数来完成。这里是:

def sum_square_difference(n):
    r = range(1, n+1)  # first n natural numbers
    return sum(i**2 for i in r) - sum(r)**2

range(1, n+1)产生第一个自然数的迭代器n

>>> list(range(1, 4+1))
[1, 2, 3, 4]

sum(i**2 for i in r)返回 r 中数字的平方和,并sum(r)**2返回 r 中数字和的平方。

于 2013-03-23T23:59:10.563 回答
5

# 正如 beta 所说, # (sum(i))^2 - (sum(i^2)) 很容易计算 :) # A = sum(i) = i*(i+1)/2 # B = sum(i^2) = i*(i+1)*(2*i + 1)/6 # A^2 - B = i(i+1)(3(i^2) - i - 2) / 12 # :) # 没有循环...只是一个公式!**

于 2013-03-24T00:17:21.557 回答
3

在这种情况下,事先进行数学计算是值得的。您可以为平方和和和的平方推导出封闭形式的解决方案。然后代码很简单(和 O(1))。

需要两种解决方案的帮助?

于 2013-03-24T00:04:16.137 回答
2
def sum_square_difference(n):
    r = range(1,n+1)
    sum_of_squares =  sum(map(lambda x: x*x, r))
    square_sum = sum(r)**2
    return sum_of_squares - square_sum
于 2013-03-23T23:57:26.787 回答
2

在 Ruby 语言中,您可以通过这种方式实现此目的

def diff_btw_sum_of_squars_and_squar_of_sum(from=1,to=100) # use default values from 1..100. 
((1..100).inject(:+)**2) -(1..100).map {|num| num ** 2}.inject(:+)
end

diff_btw_sum_of_squars_and_squar_of_sum #call for above method
于 2015-01-29T11:49:59.267 回答