分析
(1)
(2)
下面是代码,hh
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5e6 +10 ;
int n;
int C[N] ,D[N];//集合存c,d数
int main()
{
cin>>n;
memset(C , -1 , sizeof(C));//全置为-1,为了只保留字典数最小的那对cd
//枚举较大的两个数c,d
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;
}
}
//枚举a,b
for(int a = 0 ; a*a <= n ; a++)
for(int b = a ; a*a + b*b <= n ; b++)
{
int sum = n - a*a -b*b; //就是sum == c*c + d*d,
if(C[sum] != -1) //为了寻找那对最小的cd,同时也找到了最小的ab,满足a*a+b*b+c*c+d*d = n
{
printf("%d %d %d %d", a ,b , C[sum] , D[sum]);
return 0 ; //找见第一对ab后直接结束,
}
}
}