我完全不赞成这一挑战。这是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个自然数的奖励积分。
答案 0 :(得分:14)
(n*n-1)*(3*n+2)*n/12
答案 1 :(得分:8)
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)/6
和1 + 2 + ... + n = n(n+1)/2
编辑:哦,对于奖金,您只需删除前6个字符。
答案 2 :(得分:5)
由于@Gabi Purcaru已经发布了“智能”解决方案(来自两个简单的数学证明),并且这个问题的简短解决方案很容易,我将发布 long 解决方案基于模板元编程,我不认为如果没有无用的垃圾/空白就可以更长时间地使用/ /
#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)
v=1:100;sum(v)**2-sum(v.*v)
答案 5 :(得分:3)
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)
(12%~]*<:@*:*2+3*])
这只计算n(n ^ 2-1)(3n + 2)/ 12。
(([:*:+/)-[:+/*:)i.>:
这实际上会生成最多为N(i.>:
)的自然数列表,然后计算平方和[:*:+/
和平方和[:+/*:
,然后减去它们。
答案 8 :(得分:2)
(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)
~:).*(3)*2+*)*12/
从stdin \
读取数字100,{:).*(3)*2+*)*12/}%
答案 11 :(得分:1)
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)
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)
这是'正确'的尝试。
代码:$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)
“我的在你身边”
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)
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);
}