受之前做的几道题影响,第一反应就是打表
但我之前打表是三重循环从小到大遍历,这样就很有问题了
比如输入201,对应结果应该为1, 2, 14
但我的方法输出结果为4, 8, 11
很难设置判别条件使得输出结果最小
于是想到了从大到小遍历
但是用打表这个题有问题,就是给的数据并不在10000以内
我开数组开到17000还是错
开到20000才过,用时0ms
代码如下:
#include <stdio.h>
#define MAXN 20001
struct Num{
int p, q, r;
}a[MAXN+10];
int main(void) {
int i, j, k, n, t;
for(i=100; i>0; --i) {
for(j=100; j>=i; --j) {
for(k=100; k>=j; --k) {
t = i*i+j*j+k*k;
if(t >= MAXN)
break;
a[t].p = i;
a[t].q = j;
a[t].r = k;
}
}
}
while(scanf("%d", &n) != EOF) {
printf("%d %d %d\n", a[n].p, a[n].q, a[n].r);
}
return 0;
}