AC的方法:
int d[400000];
int ans[4000000];
int main()
{
int i, j, k, l;
for (i = 1; i <= 181; ++i) {
d[i] = i * i;
ans[d[i]]++;
}
for (i = 1; i <= 181; ++i) {
for (j = i; j <= 181 && d[i] + d[j] <= 32768; ++j) {
ans[d[i] + d[j]]++;
}
}
for (i = 1; i <= 181; ++i) {
for (j = i; j <= 181 && d[i] + d[j] <= 32768; ++j) {
for (k = j; k <= 181 && d[i] + d[j] + d[k] <= 32768; ++k) {
ans[d[i] + d[j] + d[k]]++;
}
}
}
for (i = 1; i <= 181; ++i) {
for (j = i; j <= 181 && d[i] + d[j] <= 32768; ++j) {
for (k = j; k <= 181 && d[i] + d[j] + d[k] <= 32768; ++k) {
for (l = k; l <= 181 && d[i] + d[j] + d[k] + d[l] <= 32768; ++l) {
ans[d[i] + d[j] + d[k] + d[l]]++;
}
}
}
}
int n;
while (cin>>n, n) {
cout<<ans[n]<<endl;
}
return 0;
}
超时的方法:
int main()
{
int n;
while (cin>>n, n) {
int x = (int)(sqrt(n * 1.0) + 0.5);
int i, ans = 0;
int j, k, l, m;
for (i = 1; i <= x; ++i) {
if (i * i == n) ++ans;
if (i * i > n) break;
for (j = i; j <= x; ++j) {
if (i * i + j * j == n) ++ans;
if (i * i + j * j > n) break;
for (k = j; k <= x; ++k) {
if (i * i + j * j + k * k == n) ++ans;
if (i * i + j * j + k * k > n) break;
for (l = k; l <= x; ++l) {
if (i * i + j * j + k * k + l * l == n) ++ans;
if (i * i + j * j + k * k + l * l > n) break;
}
}
}
}
printf("%d\n", ans);
}
return 0;
}