Title Description
AC Code
/*
解法1:
暴力枚举,枚举每一个数字,但是,这样子即便优化后,三重循环,仍然会超时!不可选!
解法2:
利用空间去换时间
开始的时候,为了方便,直接开辟出五百万的int类型空间,反正空间大,不怂
然后计算出a,b这两个数字的平方和,并记录下,数组下标是这两数字的平方和,数组里面的
值是b这个数字的值!
然后计算c,d,此时,计算出c的平方和d的平方,如果有对应a的平方和c的平方,可以组成
n的和,即是解!排序输出即可!因为是从0开始的,前面的计算a平方+b平方,也只计算字典序
小的一组,所以,直接排序输出即可!
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int nums[5000000];
int N;
int main()
{
cin >> N;
memset(nums,0xff,5000000*sizeof(int));//数组每一个数字置-1
for(int i = 0; i*i <= N; ++i)
{
for(int j = i; i*i+j*j <= N; ++j)
{
if(nums[i*i+j*j] == -1)//如果不是-1,则代表前面已经有过了,不存入!
nums[i*i+j*j] = j;
}
}
//推算 c,d的值!
for(int i = 0; i*i <= N; ++i)
{
for(int j = i; i*i + j*j <= N; ++j)
{
if(nums[N - i*i - j*j] != -1)
{
int k = nums[N-i*i-j*j];
int m = sqrt(N-i*i-j*j-k*k);
//其实这里j >= i;k >=m ,但是为了方便,直接放在数组里,用排序,损耗时间可忽略不计
int result[4];
result[0] = i;
result[1] = j;
result[2] = k;
result[3] = m;
sort(result, result+4);
for(int u = 0; u < 4; u++)
{
cout << result[u] <<" ";
}
return 0;
}
}
}
return 0;
}