牛客练习赛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; }