回复 10楼 wmf2014
谬赞了。你我算法的本质区别不在于我使用递归,而是我们遍历的方向不同。你是从小到大,而我是从大到小。观察解的情况我发现它更接近于大端,所以选择这个方向。从小端开始重复计算较多。如果要遍历所有的解,我也会从小到大计算。因为从小到大的计算范围是1~sqrt(a)/4,而从大到小的计算范围是sqrt(a)~sqrt(a)/4。
最后,认识一下,敝姓杨。姑娘贵姓?

重剑无锋,大巧不工

程序代码:
#include <stdio.h>
#include <math.h>
int f2(int a, int n)
{
static int e[5], c;
int t, i;
if(n == 4) c = 0;
t = sqrt(a);
if(t * t == a)
{
printf("%d^2", t);
for(i = 4; e[i]; printf(" + %d^2", e[i--]));
puts("");
return ++c;
}
if(n <= 1) return c;
for(i = t / 4; t >= i; t--)
{
e[n] = t;
f2(a - t * t, n - 1);
e[n] = 0;
}
return c;
}
int main()
{
int a;
scanf("%d", &a);
f2(a, 4);
return 0;
}
程序代码:#include <stdio.h>
#include <math.h>
void main()
{
int i,j,k,n,a[4]={0};
while(1)
{
printf("输入验证数(Q/q:退出):");
if(!scanf("%d",&n))break;
for(a[0]=(int)sqrt(n);a[0]>0;a[0]--)
{
k=a[0]*a[0];
for(i=1;i<4;i++)
{
if(a[i]>a[i-1])break; //免重复
a[i]=int(sqrt(n-k));
k=k+a[i]*a[i];
}
if(k==n)
{
printf("%d=%d^2",n,a[0]);
for(i=1;i<4&&a[i];i++)printf("+%d^2",a[i]);
printf("\n");
}
}
}
}
