[Project Euler] 来做欧拉项目练习题吧: 题目009
[Project Euler] 来做欧拉项目练习题吧: 题目009
周银辉
问题描述:
A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
a2 + b2 = c2
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;
}