天天看点

勾股定理(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;
}