这个,,,,这个..原来想错了..一直没做.. 今天看下..原来这样... 就写了 #include <stdio.h> #include <string.h> #include <math.h> #define MAX 300 int max =32769; int s[MAX]={0}; int dp[6][32769]; int limit = 0; void init() { for(limit=1;limit<20000;limit++) { s[limit] = limit*limit; if(s[limit]>max) break; } } int main(void) { memset(dp,0,sizeof(dp)); memset(s,0,sizeof(s)); init(); dp[0][0]=1; for(int k=1;k<=limit;k++) for(int j=0;j<max;j++) { if(s[k]+j>max) break; for(int i=1;i<5;i++) dp[i][ j+s[k] ] += dp[i-1][j]; } while(scanf("%d",&n) !=EOF&&n) { int sum = dp[1][n]+dp[2][n]+dp[3][n]+dp[4][n]; printf("%d/n",sum); } return 0; }