给定直角三角形的一边a,问存不存在这样的直角三角形,存在输出另外两边(<=1e18),否则输出-1,存在的话仅需输出一种。
补一种输出所有情形的算法:
显然给定的边是不确定的,所以需要分类讨论。
1.如果a是直边,设另外的直边是b,斜边是c
那么勾股定理显然有,由于a是知道的,不妨变形成
因此与
都是
的因子,并且注意到
,因子相加减是偶数,那么我们就可以枚举
,两边之差小于第三边,判断是否有因子,有的话两个因子和差是否是偶数即可。
2.如果a是斜边,设两直边分别是a,b
暴力枚举一条斜边,判断此时是否存在另外一条边使直角三角形合法即可。
另外,a<=2时都是无解的,特判一下即可
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a;
bool judge(ll k)
{
return (ll)sqrt(k)*(ll)sqrt(k)==k;
}
int main()
{
cin>>a;
//a是直边
//r1=c-b,r2=c+b
if(a<=2)
{
cout<<-1;
return 0;
}
for(ll r1=1;r1<a*a;r1++)
{
if(a*a%r1==0)//r1是一个因子
{
ll r2=a*a/r1;
if(a*a%r2==0&&(r1+r2)%2==0&&(r2-r1)%2==0)//r2也是因子,并且和差是偶数
{
printf("%lld %lld",(r1+r2)/2,(r2-r1)/2);
return 0;
}
}
}
//a是斜边
for(ll b=1;b<a;b++)
{
if(judge(a*a-b*b))//判断另一边是否是平方数
{
printf("%lld %lld",b,sqrt(a*a-b*b));
return 0;
}
}
cout<<-1;
return 0;
}
131

被折叠的 条评论
为什么被折叠?



