zoukankan      html  css  js  c++  java
  • HDU4206_Treasure Map_数学转换题_有技巧地暴力枚举

    题目大意:

                   给你一个直角三角形的一条直角边的平方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;
    }

  • 相关阅读:
    作业1
    113
    112
    工作量统计
    测试大纲
    2019-2020-2 20175335丹增罗布《网络对抗技术》Exp8 Web基础
    2019-2020-2 20175335丹增罗布 《网络对抗技术》Exp7 网络欺诈防范
    2019-2020-2 20175335丹增罗布 《网络对抗技术》Exp6 MSF基础应用
    2019-2020-2 20175335 丹增罗布 《网络对抗技术》Exp5 信息搜集与漏洞扫描
    2019-2020-2 20175335 丹增罗布《网络对抗技术》Exp4 恶意代码分析
  • 原文地址:https://www.cnblogs.com/cchun/p/2620887.html
Copyright © 2011-2022 走看看