毕达哥拉斯三元组由三个自然数a<b<c组成,并满足
例如,
有且只有一个毕达哥拉斯三元组满足 a+b+c=1000。求这个三元组的乘积abc。
第一种解法比较好理解,通过和 a + b + c = 1000, 求得
; 然后去判断b是否为整数,如果是就是改题的解
下面是代码实现 :
#include <stdio.h> #include <math.h> int main() { long long ans = 0; for (int a = 1; a <= 500; a++) { double b = (pow(1000, 2) - 2.0 * 1000 * a) / (2.0 * 1000 - 2.0 * a); if (b != floor(b)) continue; ans = a * (int)b * (1000 - a - (int)b); break; } printf("%lld\n", ans); return 0; }
第二种解法就是,素勾股数,,a b c两两互质,那a , b, c 的乘以同一个数他们的相乘得到的数之间也是勾股数;通过 a , b, c两两互质的性质,可以推到得到他们为两个奇数一个偶数,然后再通过,勾股定理可以推到得到,a, b为一奇一偶,
假设a为偶,b为偶,违反了第一条性质就是abc两两互质,排除
假设a为奇数,b为奇数,
设
然后这个结果去模4,等于2
而 c ^ 2 = 4 * k ^ 2 模4 等于 0;
所以这个也不成立
所以a, b为一奇数一偶
现在假设a为那个偶数
a = 2 * n * m
通过欧几里得算法可以求得他们互质
所以他们分别对应了 和
有一下等式
最终
通过此式子就可以来进行减少时间复炸度
代码实现如下:
#include <stdio.h> #define MAX_N 100 int main() { int k = 0; for (int i = 1; i <= MAX_N; i++) { for (int j = i + 1; j <= MAX_N; j++) { int a = 2 * i * j; int b = j * j - i * i;//因为b为正整数,所以需要大的数去减小的数才能得到; int c = i * i + j * j; if (a * a + b * b != c * c) continue; if (1000 % (a + b + c)) continue;//为什么是模而不是等于,因为他是a + b + c的k倍才等于1000 k = 1000 / (a + b + c); printf("%d\n", a * b * c * k * k * k); break; } if (k) break; } return 0; }
最终答案:31875000 各边分别为200,375,425 他们对应的素勾股数8,15,17