杭电acm1407求查错
请大牛帮忙看看,我的代码错在哪里了。不胜感激!
#include<stdio.h>
#include<math.h>
#define MAX 10000
int main()
{
int num,i,j,k,x,y,z,tmp;
int flag[MAX+1]={0};
for(i=1;i<=100;++i)
flag[i*i]=1;
while((scanf("%d",&num))!=EOF)
{
tmp=(int)sqrt((double)(num/3));
for(k=tmp;k*k<num;++k)
for(i=1;i*i<=num/3;++i)
{
j=num-i*i-k*k;
if(flag[j] && j>=i*i && j<=k*k)
{
x=i; y=(int)(sqrt(j)); z=k;
goto F1;
}
}
F1:printf("%d %d %d\n",x,y,z);
}
return 0;
}
[解决办法]
编译能通过吗?编译错误先粘上来
[解决办法]
有这么一种情况
你的输入:83
你的输出:3 5 7
而输出要求:对于每组测试数据,请按照x,y,z递增的顺序输出它的一个最小正整数解
如果1 1 9 比起 3 5 7算是更小的一组解的话,就表明算法有问题哈
[解决办法]
用穷举法搞定
#include <stdio.h>void printijk(int i, int j, int k){ printf("%d %d %d\n", i, j, k);}int main(){ int num; int i, j, k; int flag; while((scanf("%d", &num)) != EOF) { flag = 0; for (i = 1; i <= 100; i++) { for (j = 1; j <= 100; j++) { for (k = 1; k <= 100; k++) { if (num == i*i+j*j+k*k) { printijk(i, j, k); flag = 1; break; } } if (flag == 1) break; } if (flag == 1) break; } } return 0;}