2014-04-25 94 views
0

所以我最近发现了一个项目euler,这对于在编程语言中进行实验和练习来说非常棒。我最近刚刚想出了问题6的答案,但我觉得这是一种丑陋而不雅的做法。欧拉项目 - python中的#6

的问题询问:

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

前10个自然数总和的平方为: (1 + 2 + ... + 10)** 2 = 552 = 3025

因此,前10个自然数的平方和数字和平方和为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比较陌生,所以原谅我。我想学习好的编码技术,而不是养成编写错误代码的习惯。提前致谢!

+0

要在堆栈溢出将代码粘贴,复制和粘贴正是你所拥有的,突出显示所有的它,然后单击' {}'代码格式化按钮。 – geoffspear

+7

此问题似乎是脱离主题,因为它属于http://codereview.stackexchange.com – jonrsharpe

+0

不要混合使用空格和制表符。你的缩进被搞砸了。只能使用空格。 – ooga

回答

0

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

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

  • 有可能只用1,而/ for循环,而不是4

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 
+0

是的,这真棒!谢谢 – danielm01

+0

你可以在'sum'调用中去除'[]'括号以获得更好的效果效率(毕竟这是欧拉项目;-)) –

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 
    )