回复 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"); } } } }