天天看點

勾股定理(Pythagorean Triples,cf 707C)

隻能說以後程式設計要先讨論清楚各種情況,保證不重不漏了,再開始編寫程式吧。

百度勾股定理,發現推論一隻。

勾股數組 勾股數組是滿足勾股定理

勾股定理(Pythagorean Triples,cf 707C)

的 正整數組

勾股定理(Pythagorean Triples,cf 707C)

,其中的

勾股定理(Pythagorean Triples,cf 707C)

稱為勾股數。例如

勾股定理(Pythagorean Triples,cf 707C)

就是一組勾股數組。 任意一組勾股數

勾股定理(Pythagorean Triples,cf 707C)

可以表示為如下形式:

勾股定理(Pythagorean Triples,cf 707C)

勾股定理(Pythagorean Triples,cf 707C)

勾股定理(Pythagorean Triples,cf 707C)

,其中

勾股定理(Pythagorean Triples,cf 707C)

均為正整數,且

勾股定理(Pythagorean Triples,cf 707C)

。 定理用途 已知直角三角形兩邊求解第三邊,或者已知三角形的三邊長度,證明該三角形為直角三角形或用來證明該三角形内兩邊垂直。利用勾股定理求線段長度這是勾股定理的最基本運用。 [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;
}