題目描述
AC代碼
/*
解法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;
}