solution.cpp 1.4 KB
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
#include <iostream>
#include <cstdio>
#include <map>
#include <cmath>
using namespace std;

int N;
map<int, int> cache; //int和int映射,哈希表用于缓存数值
int main()
{
    scanf("%d", &N);
    for (int c = 0; c * c <= N / 2; c++)
    {
        for (int d = c; c * c + d * d <= N; d++)
        {
            if (cache.find(c * c + d * d) == cache.end()) //如果未找到,再去存,已经存在就不需要去存了
                cache[c * c + d * d] = c;                 //查平方数,先要看cache里面有没有,没有说明它不是一个平方数存起来
            //有的话通过较小的数映射找到它
        }
    }
    //c*c+d*d要比a*a+d*d要大(至少相同)
    for (int a = 0; a * a <= N / 4; a++)
    { //单独看a*a小于等于N/4
        for (int b = a; a * a + b * b <= N / 2; b++)
        { //a*a+b*b小于等于N/2
            if (cache.find(N - a * a - b * b) != cache.end())
            {                                                 //查表,能找到
                int c = cache[N - a * a - b * b];             //c就可以知道
                int d = int(sqrt(N - a * a - b * b - c * c)); //d开方
                printf("%d %d %d %d\n", a, b, c, d);
                return 0; //跳出整个主函数
            }
        }
    }
    return 0;
}
//整个过程不需要再排序,因为一开始在写代码时,就已经限定了顺序大小,c*c+d*d要比a*a+d*d要大