总和的差异

时间:2010-10-20 20:12:53

标签: math language-agnostic

我完全不赞成这一挑战。这是Project Euler problem 6

  

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

     

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

     

因此,前十个自然的平方和之间的差异   数字和总和的平方是3025 - 385 = 2640。

     

找出前一百的平方和之间的差异   自然数和总和的平方。

当我注意到我的解决方案(在Python中)非常非常短时,我开始对这里的一些代码感兴趣。我想看看其他一些语言(perl,我正在看你!)如何将它带入这个简单的问题。

那么,解决这个问题的最短方法是什么? Shortest意味着源代码中的字符数最少。

注意:解决前n个自然数的奖励积分。

20 个答案:

答案 0 :(得分:14)

几乎任何语言:20个字符。

(n*n-1)*(3*n+2)*n/12

答案 1 :(得分:8)

40 / 49 43个字符;应该适用于大多数语言

n=100;(n*(n+1)/2)**2-n*(n+1)*(2*n+1)/6;

应该使用某些语言;

n=100;n*(n+1)*n*(n+1)/4-n*(n+1)*(2*n+1)/6;

这应该适用于大多数语言。

请注意1^2 + 2^2 + ... + n^2 = n(n+1)(2n+1)/61 + 2 + ... + n = n(n+1)/2

编辑:哦,对于奖金,您只需删除前6个字符。

答案 2 :(得分:5)

由于@Gabi Purcaru已经发布了“智能”解决方案(来自两个简单的数学证明),并且这个问题的简短解决方案很容易,我将发布 long 解决方案基于模板元编程,我不认为如果没有无用的垃圾/空白就可以更长时间地使用/ /

C ++ - 648 659个字符

#include <iostream>

template<int Num>
struct Square
{
    static const int Value = Num*Num;
};

template<int Num>
struct NatSum
{
    static const int Value=Num+NatSum<Num-1>::Value;
};

template<>
struct NatSum<0>
{
    static const int Value = 0;
};

template<int Num>
struct SquaresSum
{
    static const int Value=Square<Num>::Value+SquaresSum<Num-1>::Value;
};

template<>
struct SquaresSum<0>
{
    static const int Value = 0;
};

template<int Num>
struct DifferenceOfSums
{
    static const int Value = Square<NatSum<Num>::Value>::Value - SquaresSum<Num>::Value;
};

int main()
{
    std::cout<<DifferenceOfSums<100>::Value<<std::endl;
    return 0;
}

现在享受在编译时计算的挑战结果并直接放入可执行文件中。 :)

答案 3 :(得分:4)

Perl 15 chars:

 print 25164150;

答案 4 :(得分:4)

八度:28个字符

v=1:100;sum(v)**2-sum(v.*v)

答案 5 :(得分:3)

Mathematica“猜测答案”

Mathematica能够“猜测”生成某些序列的函数。

所以,如果你计算这个问题的前六个术语,结果是:

 {0, 4, 22, 70, 170, 350}  

现在我们可以将该序列输入“序列oracle”,并获得函数:

FindSequenceFunction[{0, 4, 22, 70, 170, 350}]

Mathematica回答:

1/12 (#-1) (2 # + 5 #^2 + 3 #^3) &  

这是在其他答案的任何地方发布的公式。

所以我们可以使用前六个词来计算第100个词......不知道如何生成它们!

In> FindSequenceFunction[{0, 4, 22, 70, 170, 350}][100]
Out> 25164150    

答案 6 :(得分:2)

Mathematica 17个字符: 应用FullSimplify

n(n^2-1)(3n+2)/12

Mathematica 27个字符: 因为它不需要那些讨厌的乘法符号......

(n(n+1))^2/4-n(n+1)(2n+1)/6

或以矢量形式, Mathematica 28 25 chars:在审核了另一个Mathematica answer之后,我能够剃掉另外3个字符

Plus@@#^2-#.#&@Range[100]

答案 7 :(得分:2)

J,19个字符

(12%~]*<:@*:*2+3*])

这只计算n(n ^ 2-1)(3n + 2)/ 12。

J,21个字符

(([:*:+/)-[:+/*:)i.>:

这实际上会生成最多为N(i.>:)的自然数列表,然后计算平方和[:*:+/和平方和[:+/*:,然后减去它们。

答案 8 :(得分:2)

17或18个字符

(3n/2+1)(n^3-n)/6
(3n/2+1)(n**3-n)/6

取决于您的语言如何做指数

编辑:如果你的语言不理解隐式乘法,那么20个字符(3*n/2+1)*(n**3-n)/6 ......但Mathematica确实如此。

答案 9 :(得分:1)

C#

Math.Pow(Enumerable.Range(1, 100).Sum(), 2)-
Enumerable.Range(1, 100).Select(i => i*i).Sum()

答案 10 :(得分:1)

Golfscript - 17个字符

~:).*(3)*2+*)*12/

从stdin \

读取数字

23个字符,以生成前100个

100,{:).*(3)*2+*)*12/}%

答案 11 :(得分:1)

Haskell - 33个字符

g x=sum.map(\y->(y-1)*y*y)$[2..x]

编辑:

要制作完整的节目,我们需要79个字符

import System
main=getArgs>>=print.(\x->sum.map(\y->(y-1)*y*y)$[2..x]).read.head

答案 12 :(得分:1)

Python 2.x,48个字符

a=range(n+1)
print sum(a)**2-sum(x*x for x in a)

我最初是用Python 3.x编写的,它是49个字符:

a=range(n+1)
print(sum(a)**2-sum(x*x for x in a))

答案 13 :(得分:0)

数学: 蛮力(39个字符,6个可移动):

    Plus@@# ^2 - Plus@@ (#^2) &@ Range[100]

通过数学,即时(70个字符,24个可移动 - 我们不 简化,指定下限,或使用3个​​字符的函数名称):

    In[1]:= foo[k_] = Simplify[Sum[n, {n, 1, k}]^2 - Sum[n^2, {n, 1, k}]]
            foo[100]
    Out[1]= 1/12 k (-2 - 3 k + 2 k^2 + 3 k^3)
    Out[2]= 25164150

通过先前执行的数学运算(40个字符,11个可移动的)

    1/12 # (-2 - 3 # + 2 #^2 + 3 #^3) &@ 100

这有多短取决于我们允许的先前计算量。

答案 14 :(得分:0)

Perl,41 Chars

这是'正确'的尝试。

代码$c+=$_**2,$e+=$_ for 0..pop;print$e**2-$c

<强>用法

$ perl -e '$c+=$_**2,$e+=$_ for 0..pop;print$e**2-$c' 100
25164150

答案 15 :(得分:0)

import numpy
v = numpy.arange(100)
print sum(v)**2 - sum(v*v)

答案 16 :(得分:0)

Mathematica 8 chars

“我的在你身边”

  In> 25164150
  Out> 25164150

25164150是一个完整有效的Mathematica表达式,可以单独进行评估。

答案 17 :(得分:0)

我的也很短......

def euler6(limit):
    """
    calculate the difference between the sum of the squares of
    the first n natural numbers and the square of the sum of
    the same n natural numbers.

      >>> euler6(10)
      2640


    """
    sequence = range(limit+1)
    squares = sum(map(lambda x: x*x, sequence))
    sums = sum(sequence)
    sums *= sums
    return sums-squares

答案 18 :(得分:0)

Oracle SQL - 82个字符

select sum(l)*sum(l)-sum(l*l) from (select level l from dual connect by level<=:n)

答案 19 :(得分:0)

以下是C * 欢呼中的解决方案 *

#include <stdio.h>
#include <stdlib.h>
//Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.
int main()
{
   int sum1=0,sum2=0,psum=0;

   for(int i=1;i<=100;i++)
   sum1+=i*i;

   for(int i=1;i<=100;i++)
   psum+=i;
   sum2=psum*psum;

   printf("\nDifference is: %d\n",sum2-sum1);


}