原题是要求一组一组的输入而不是多组输入,所以网上的大部分代码都没办法过,会超时。
如果是原题,这个代码可以过:
#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
map<int,int>q;
int main()
{
int n;
scanf("%d",&n);
for(int c=0;c*c<=n/2;c++)
{
for(int d=c;c*c+d*d<=n;d++)
{
if(q.find(c*c+d*d)==q.end()) ///确保所取到的c是所有符合条件中最小的那一个
q[c*c+d*d]=c;
}
}
int flag=0;
for(int a=0;a*a<=n/4;a++)
{
for(int b=a;b*b+a*a<=n/2;b++)
{
if(q.find(n-b*b-a*a)!=q.end())
{
int c=q[n-b*b-a*a];
int d=(int)(sqrt(n-a*a-b*b-c*c));
printf("%d %d %d %d\n",a,b,c,d);
flag=1;
return 0; //直接退出程序
}
}
}
return 0;
}
如果多组输入,下面的代码可以过:
#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int flag=1;
for(int a=0;a*a<=n/4 && flag;a++)
{
for(int b=a;b*b+a*a<=n/2 &&flag;b++)
{
for(int c=b;4*(a*a+b*b+c*c)<=n*3 &&flag;c++)
{
int t=n-a*a-b*b-c*c;
double d=sqrt((double)t);
if(fmod(d,1)==0&&(d>=c))
{
flag=0;
printf("%d %d %d %d\n",a,b,c,(int)d);
}
}
}
}
}
}