欧拉计划39题

Integer right triangles
If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exactly three solutions for p = 120.
{20,48,52}, {24,45,51}, {30,40,50}
For which value of p ≤ 1000, is the number of solutions maximised?

题目:
如果 p 是一个直角三角形的周长,三角形的三边长 {a, b, c} 都是整数。对于 p = 120 一共有三组解:
{20,48,52}, {24,45,51}, {30,40,50}
对于 1000 以下的 p 中,哪一个能够产生最多的解? 

         这个题求的是给出一个周长,求可以产生的直角三角形有多少个;

        下面开始分析:

        1.有周长,那么设三条边为a,b,c;a+b+c = p  c= p-a-b  通过勾股定理转换a^2 + b ^ 2 =(p - a - b) ^ 2展开最终得到b = (p^2 - 2*p*a) / (2 * p - 2 * a)

        2.那么b得到了就枚举a,那c如何取得到,通过勾股定理;c = sqrt(a^2 + b^2);

        3.如何取判断,b要创建为double类型,判断时,通过b == floor(b),floor函数向下取整,如果b等于他的向下取整说明b为整数,c = p -a -b,a是枚举的整数,那么c也一定是整数,说明找到了一个解

        4 .记录c的值,防止找到重复答案;

        5.a和b是直角边,那么就形成a<=b<c,那么a<=p/3,所以缩小了查找范围;

        用以上5个条件就可以写代码了,下面是代码实现:

        

#include <stdio.h>
#include <math.h>
#include <string.h>
#define MAX_N 1000

int cnt[MAX_N + 5];
int s[MAX_N + 5];


int main() {
    int len = 0, ans = 0;
    for (int p = 3; p < MAX_N; p++) {//枚举周长
        memset(s, 0, sizeof(int) * (MAX_N + 5));
        for (int a = 1; a <= p / 3; a++) {//枚举a
            double b = (pow(p, 2), - 2.0 * p * a) / (2.0 * p - 2.0 * a);//通过公式求b
            int c = sqrt(b * b + a * a);//勾股定理求c
            if (b != floor(b) || s[c]) continue;//b不为整数,或者c重复继续枚举下一个
            s[c] = 1;//标记当前c已经求过
            cnt[p]++;//解+1
        }
        if (len < cnt[p]) {
            len = cnt[p]; 
            ans = p;
        }
    } 
    printf("%d %d\n", ans, len);
    return 0;
}

最终答案:840, 11 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

初猿°

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

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

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

打赏作者

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

抵扣说明:

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

余额充值