试试这个~就是感觉数组开大了一点~
程序代码:
#include<stdio.h>
#include<math.h>
#define N 1000000
typedef struct Node
{
unsigned short i;
unsigned short j;
}Node;
Node a[N+1]={0};
void Init();
void fun(int n);
void Data(int temp[],int* k,int n);
int main()
{
int n=0;
Init();
while (scanf("%d",&n)!=EOF)
fun(n);
return 0;
}
void Init()
{
int i=0;
int j=0;
int t=(int )sqrt(N);
for (i=0;i<=t;++i)
for (j=0;j<=t;++j)
{
if (i*i+j*j>N)
break;
if (a[i*i+j*j].i+a[i*i+j*j].j!=0)
continue;
a[i*i+j*j].i=i;
a[i*i+j*j].j=j;
}
}
void fun(int n)
{
int m=n;
int k=0;
int i=0;
int j=0;
int flag=0;
int temp[4]={0};
if (n>N)
{
puts("超过数据指定范围!");
return ;
}
if (n<0)
{
puts("输入数据不能小于0!");
return ;
}
if (fmod(sqrt(n),1.0)==0)
{
printf("0 0 0 %d\n",(int)sqrt(n));
return ;
}
if (a[n].i+a[n].j!=0)
{
printf("0 0 %d %d\n",a[n].i,a[n].j);
return ;
}
while (m>=0)
{
int k=0;
int s=0;
while (m&&((a[m].i+a[m].j==0)||(a[n-m].i+a[n-m].j==0)))
--m;
if (flag==0&&m==0&&n!=0)
{
puts("不能由4个开方数组成!");
return ;
}
flag=1;
if (m==0)
break;
if (a[m].i!=0)
++s;
if (a[m].j!=0)
++s;
if (a[n-m].i!=0)
++s;
if (a[n-m].j!=0)
++s;
memset(temp,0,sizeof(temp));
Data(temp,&k,a[m].i);
Data(temp,&k,a[m].j);
Data(temp,&k,a[n-m].i);
Data(temp,&k,a[n-m].j);
if (s==3)
break;
--m;
}
for (i=0;i<4;++i)
for (j=0;j<3-i;++j)
if (temp[j]>temp[j+1])
{
temp[j]^=temp[j+1];
temp[j+1]^=temp[j];
temp[j]^=temp[j+1];
}
for (i=0;i<4;++i)
printf("%d ",temp[i]);
puts("");
}
void Data(int temp[],int* k,int n)
{
if (n==0)
return ;
temp[3-*k]=n;
*k=*k+1;
}
[此贴子已经被作者于2017-4-7 02:15编辑过]