题目大意:

               给你一个直角三角形的一条直角边的平方n,这条边可能是直角边,然后要求求出另外一条直角边,还有求出斜边的长度,要求另外一条直角边跟斜边都是整数。 1 <= n <= 10^9.

解题思路:

               给出的直角边异常巨大,而且另外两条边的长度根本没有上限。但是可以转换。z^2 - y^2 = n,那么有(z + y)*(z - y) = n,变成了

a * b = n,由于z跟y都是整数,那么a跟b都是整数,并且a跟b都肯定大于0,是自然数,因为z必定大于y。所以枚举出所有a跟b,然后

z + y = a, z - y = b,由这两个公式求出z跟y即可。

解题感想:

              比赛的时候稍微想到了转换,但是闲麻烦就没有继续转换下去了,想想自己实在是太笨了。

代码:

#include <iostream>
#include <cmath>
using namespace std;

int main(void)
{
    int cas;
    scanf("%d", &cas);
    while(cas--)
    {
        int n, a, b, z, y;
        scanf("%d", &n);
        int tempn = (int)sqrt((double)n);
        int ansY, ansZ;
        ansY = ansZ = INT_MAX;
        for(int i = 1; i <= tempn; i++)
        {
            if(n % i == 0)
            {
                a = n / i;
                b = i;
                if((a + b) % 2 == 0)
                {
                    z = (a + b) / 2;
                    y = z - min(a, b);
                    if(z < ansZ || y < ansY)
                    {
                        ansY = y, ansZ = z;
                    }
                }

            }
        }
        if(ansZ == INT_MAX)//有一个能求,另一个就可求
        {
            printf("IMPOSSIBLE\n");
        }
        else
            printf("%d %d\n", ansY, ansZ);
    }
    return 0;
}

posted on 2012-08-03 02:10  cchun  阅读(166)  评论(0编辑  收藏  举报