只能说以后编程要先讨论清楚各种情况,保证不重不漏了,再开始编写程序吧。
百度勾股定理,发现推论一只。
勾股数组 勾股数组是满足勾股定理
的 正整数组
,其中的
称为勾股数。例如
就是一组勾股数组。 任意一组勾股数
可以表示为如下形式:
,
,
,其中
均为正整数,且
。 定理用途 已知直角三角形两边求解第三边,或者已知三角形的三边长度,证明该三角形为直角三角形或用来证明该三角形内两边垂直。利用勾股定理求线段长度这是勾股定理的最基本运用。 [5]
已知 2n+1=(n+1)^2-n^2
把输入当成a。
当a<=2时特殊判断。
其他情况只要将a拆成两个数相乘,其中一个数为大于1的奇数则有解,按公式算。
讲详细点,设2n+1为大于1的奇数,且a=k*(2n+1)=k*((n+1)^2-n^2),令m=n+1,再带入上面的公式,b,c就求出来了。
若无法拆成上述情况,说明能被4整除,则套用3,4,5的情况。例如8,就套用6,8,10。
讲详细点,说明a所有因数都是偶数,而a又>2,所以a=2^n (n>1)。
事实上就1,2无解。
代码
#include<stdio.h>
#include<math.h>
typedef long long ll;
int main()
{
ll a;
scanf("%I64d",&a);
if(a<=2)
{
puts("-1");
return 0;
}
if(a%3==0)
{
printf("%I64d %I64d\n",a/3*4,a/3*5);
return 0;
}
if(a%4==0)
{
printf("%I64d %I64d\n",a/4*3,a/4*5);
return 0;
}
ll zhi=0;
if(a<=100)
{
for(ll i=5;i<=a;i++)
if(a%i==0)
{
zhi=i;
break;
}
if(!zhi)
{
if(a%2) zhi=a;
else zhi=a/2;
}
}
else
{
for(ll i=5;i<=sqrt(a);i++)
if(a%i==0)
{
zhi=i;
break;
}
if(!zhi)
{
if(a%2) zhi=a;
else zhi=a/2;
}
}
ll n=(zhi-1)/2;
ll m=n+1;
ll k=a/zhi;
printf("%I64d %I64d\n",2*k*n*m,k*(m*m+n*n));
return 0;
}