项目Euler - python中的#6

时间:2014-04-25 18:47:29

标签: python-2.7

所以我最近刚刚发现了一个项目euler,它非常适合在编程语言中进行实验和练习。我刚刚找到问题6的答案,但我觉得这样做是一种丑陋而不雅的方式。

问题是:

前十个自然数的平方和是, 1 ** 2 + 2 ** 2 + ... + 10 ** 2 = 385

前十个自然数之和的平方是, (1 + 2 + ... + 10)** 2 = 552 = 3025

因此,前十个自然数的平方和与总和的平方之差为3025 - 385 = 2640。

找出前100个自然数的平方和与总和的平方之间的差异。

我的代码如下所示:

def sum_sq(value):
    count = value + 1
    while count > 0:
        sum_sq = []
        for x in range(count):
            sum_sq.append(x**2)
            count = count - 1
        sum_sq = sum(p)

    count1 = value + 1
    while count1 > 0:
        sq_sum = []
        for i in range(count1):
            sq_sum.append(i)
            count1 = count1 - 1
        sq_sum = sum(sq_sum)**2
    return sq_sum - sum_sq


>>> sum_sq(10)
2640
>>> sum_sq(100)
25502115

你们有没有任何建议让这个更短更有效率?我对python比较新,请原谅我。我想学习良好的编码技术,而不是养成编写错误代码的习惯。提前谢谢!

3 个答案:

答案 0 :(得分:2)

你可以简单地做

def sum_sq(value):
    # list of product of all unique pairs (ignoring order)  
    # of numbers in the range 1 to value, both included
    t = [i*j for i in range(1, value) for j in range(i+1, value+1)]
    return 2 * sum(t)

那是因为

(1 + 2 + 3 + ... + n)^2 - (1^2 + 2^2 + ... + n^2)
= 2(
    1*2 + 1*3 + ... + 1*n +
    2*3 + 2*4 + ... + 2*n +
    ...                   +
    ...                   +
    (n-1)*n  
   )    

答案 1 :(得分:0)

我很久以前也在Python中解决了这个问题。一些提示:

  • 您不需要保存列表中的每个值来回答问题。那是浪费时间。

  • 只能使用1 for while / for-loop而不是4来获得答案。

答案 2 :(得分:0)

1行代码,这对你有用吗?

def sum_sq(n):
    return sum([i for i in range(n+1)])**2-sum([i**2 for i in range(n+1)])
>>> sum_sq(10)
2640