隻能說以後程式設計要先讨論清楚各種情況,保證不重不漏了,再開始編寫程式吧。
百度勾股定理,發現推論一隻。
勾股數組 勾股數組是滿足勾股定理
的 正整數組
,其中的
稱為勾股數。例如
就是一組勾股數組。 任意一組勾股數
可以表示為如下形式:
,
,
,其中
均為正整數,且
。 定理用途 已知直角三角形兩邊求解第三邊,或者已知三角形的三邊長度,證明該三角形為直角三角形或用來證明該三角形内兩邊垂直。利用勾股定理求線段長度這是勾股定理的最基本運用。 [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;
}