牛客练习赛51 勾股定理 题解

勾股定理

http://www.nowcoder.com/questionTerminal/13349cacecbe4f6e94319bd18bee229e

题意分析

给出a,求任意直角三角形边长b,c。

解题思路

  • 如果读入的边是0,或者1,或者2,易证这条边不能找到另外2个整数直角边了。直接-1

  • 判断3边能组成直角三角形的方法是勾股定理,所以要用这个勾股定理找出合适的b、c。

  • ,因为我们只需要输出1组解,我们可以假设a肯定不是斜边。只知道a,怎么找出b跟c的关系?设c>b

  • 由于我们这里的c+b不太好入手,于是考虑从“c-b”入手。

  • 把两边同时(前面说了c>b),得到

  • 由于右边的c+b是整数,所以我们一定要保证是正整数。

    1. 当c-b=1

    • 一定是正整数,而且c=b+1。
    • 原式右边的c+b可以化为
    • 易证右边那个2b+1肯定是奇数,
    • 在我们这个已经设置了的前提下,,则一定是奇数,并且易证也一定是奇数。
    • 把b用带a的式子表示,得到:
    • 同理,
      • 上面我们设了一个条件,让c-b=1的时候,必有①a为奇数,②存在一组合法解b=……,c=……。
      • 现在直接去掉c-b=1这个大前提,当a为奇数,代入到上面的式子里面计算,可以发现b、c均为正整数而且一定是“一个奇数一个偶数”
      • 所以当a为奇数的时候肯定存在合法解。b和c的计算公式就是上面那个了。

    2. 当(c-b)%2=0

    • 刚才讨论了c-b=1,就是想方设法让(c-b)%2=1。
    • 现在先来试试(c-b)%2=0能不能像刚刚证明奇数一样,把偶数证明出来。
    • 直接设c-b=2,则原式可化为
    • c=b+2,则上面那条可化为,易证右边那个肯定是偶数。则一定是4的倍数。
    • 此时,用带a的式子表示b,得到
    • 同样的,
    • 所以当a是偶数的时候,存在一组解,b、c的计算公式如下。
  • 这两个小标题考验式的变形能力,你也可以变形为其他形式,但是要想到怎么变形确实是难。

参考程序

#include<stdio.h>
long long a,b,c;
int main()
{
    scanf("%lld",&a);
    if(a==0||a==1||a==2)
        {
            printf("-1");
            return 0;
        }
    if(a%2==1)
        {
            b=(a*a-1)/2;
            c=b+1;
        }
    if(a%2==0)
        {
            b=((a*a)/2-2)/2;
            c=b+2;
        }
    printf("%lld %lld",b,c);
    return 0;
}
全部评论

相关推荐

11-02 09:49
已编辑
货拉拉_测试(实习员工)
热爱生活的仰泳鲈鱼求你们别卷了:没事楼主,有反转查看图片
点赞 评论 收藏
分享
10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务