[Project Euler] 来做欧拉项目练习题吧: 题目009

时间:2022-01-22 00:08:57

                                        [Project Euler] 来做欧拉项目练习题吧: 题目009

                                                                周银辉 

 

问题描述:

A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,

a 2 +  b 2 =  c 2

For example, 32 + 42 = 9 + 16 = 25 = 52.

There exists exactly one Pythagorean triplet for which a + b + c = 1000.

Find the product abc. 

 

问题分析:

毕达哥拉斯三元组:三个正整数a,b,c 满足 a^2 + b^2 = c^2

维基一下:http://en.wikipedia.org/wiki/Pythagorean_triple (在维基这方面,国人发现手机网络比家里宽带更能正常显式?)

发现构造毕达哥拉斯三元组的方法有很多(值得注意的是,有些方法是构造“原毕达哥拉斯三元组primitive Pythagorean triple (PPT)”的,由PPT可以构造出其他三元组),其中一种方法是这样的:

取任意的正整数m, n (m>n)
a = m^2 - n^2
b = 2*m*n
c = m^2 + n^2

由于题目要求 a+b+c = 2*m^2 + 2*m*n = 1000  

所以,m^2 + m*n = 500, n=500/m-m

又由于m,n是正整数,那么m^2必定小于500, 也就是说, m<sqrt(500)<23 

那么很简单地,枚举并试探m就可以找到正确答案了。

int test()
{
int m, n, a, b, c, result=0;
double t;
for(m=2; m<23; m++)
{
t = 500.0/m - m;
n = (int)t;
if(t-n==0 && m>n) //t-(int)t==0说明t是整数
{
printf("m=%d, n=%d\n", m, n);
a = m*m - n*n;
b = 2*m*n;
c = m*m + n*n;
result = a*b*c;
printf("a=%d, b=%d, c=%d, abc=%d\n\n", a, b, c, result);
}
}
return result;
}