其实和计算两个数的平方一样,这里拆成两部分,先求cd,再求ab,用数组保存某一值对应的cd,另外从0开始遍历,最先求出的四个数一定是升序排列中第一个答案。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 5000010;
int C[N], D[N];
int main(){
int n;
cin >> n;
memset(C, -1, sizeof(C));
for(int c = 0; c * c <= n; c++){
for(int d = c; c * c + d * d <= n; d++){
int s = c * c + d * d;
if(C[s] == -1){
C[s] = c;
D[s] = d;
}
}
}
for(int a = 0; a * a <= n; a++){
for(int b = a; a * a + b * b <= n; b++){
int s = n - a * a - b * b ;
if(C[s] != -1){
printf("%d %d %d %d\n", a, b, C[s], D[s]);
return 0;
}
}
}
return 0;
}