欧拉计划第9题

毕达哥拉斯三元组由三个自然数a<b<c组成,并满足

a ^ 2 + b ^ 2= c ^ 2

例如,3 ^ 2+ 4 ^ 2= 25 5 ^ 2 = 25

有且只有一个毕达哥拉斯三元组满足 a+b+c=1000。求这个三元组的乘积abc。

第一种解法比较好理解,通过a ^ 2 + b ^ 2 = c ^ 2和 a + b + c = 1000, 求得

b = (1000 ^ 2 - 2 * 1000 * a) / (2 * p - 2 * a); 然后去判断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 ^ 2 + b ^ 2 = c ^ 2,a b c两两互质,那a , b, c 的乘以同一个数他们的相乘得到的数之间也是勾股数;通过 a , b,  c两两互质的性质,可以推到得到他们为两个奇数一个偶数,然后再通过,勾股定理可以推到得到,a, b为一奇一偶,

假设a为偶,b为偶,违反了第一条性质就是abc两两互质,排除

假设a为奇数,b为奇数,

a = 2 * n + 1 b = 2 * m + 1, c = 2 * k

a ^ 2 + b ^ 2 = 4 * n ^ 2 + 1 + 4 * m ^ 2 + 1  然后这个结果去模4,等于2

而 c ^ 2 = 4 * k ^ 2 模4 等于 0;

所以这个也不成立

所以a, b为一奇数一偶

现在假设a为那个偶数

a = 2 * n * m

c ^ 2 - b ^ 2 = 4 * n ^ 2 * m ^ 2;

(c - b) * (c + a) = 4 * m * n

 (c - b) / 2 * (c + b) / 2 = m ^ 2 * n ^ 2

(c - b) / 2 (c + b) / 2通过欧几里得算法可以求得他们互质

所以他们分别对应了 m ^ 2 和n ^ 2 

有一下等式(c - b) / 2 = n ^ 2   (c + b) / 2 = m ^ 2

最终

a = 2 * m * n \\ b = m ^ 2 - n ^ 2\\ c = m ^ 2 + n ^ 2

通过此式子就可以来进行减少时间复炸度

代码实现如下:

#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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初猿°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值