思路
二分做法
a,b,c,d <= √N
由N的范围可以推出a,b,c,d范围,cpp一秒运算1e8左右,所以我们只能枚举两个数
因此我们需要用空间换时间
先c²+d²存起来降低时间复杂度
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct sum{
int s,ygl,zzw;
}f[5000000];//需要存放的数据非常多,最坏情况下要存5000000组数据
bool cmp(sum a,sum b)//比较函数,等下sort函数要用
{
if(a.s!=b.s)return a.s<b.s;
if(a.ygl!=b.ygl)return a.ygl<b.ygl;
return a.zzw<b.zzw;
}
int main()
{
int n,m=0;
cin>>n;
for(int c=0;c*c<=n;c++)
{
for(int d=c;c*c+d*d<=n;d++)
{
f[m++]={c*c+d*d,c,d};
}
}
sort(f,f+m,cmp);//传入指针或者迭代器
for(int a=0;a*a<=n;a++)
{
for(int b=a;a*a+b*b<=n;b++)
{
int temp=n-a*a-b*b;
int l=0,r=m-1;//二分来查找存放的数据当中有没有符合要求的数据
while(l<r)
{
int mid=(l+r)/2;
if(f[mid].s>=temp)r=mid;
else l=mid+1;
}
if(f[l].s==temp)
{
cout<<a<<' '<<b<<' '<<f[l].ygl<<' '<<f[l].zzw;
return 0;
}
}
}
return 0;
}
再来一个暴搜骗分版
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int n;
cin>>n;
for(int a=0;a*a<=n;a++)
{
for(int b=a;a*a*+b*b<=n;b++)
{
for(int c=b;a*a+b*b+c*c<=n;c++)
{
int temp=n-a*a-b*b-c*c;
int d=sqrt(temp);
if(d*d==temp)
{
cout<<a<<' '<<b<<' '<<c<<' '<<d;
return 0;
}
}
}
}
}