题解 | #百鸡问题#
百鸡问题
https://www.nowcoder.com/practice/01d161052db64c249a47fc723b4fd5db
#include <stdio.h>
int main() {
int x,y,z;
int n;
//int cnt=0;
scanf("%d",&n);
for(x=0;x<=100;x++){
for(y=0;y<=100;y++){
//递增输出,z直接100-x-y就行了,少一层循环
z=100-x-y;
// cnt++;
if(5*x+3*y+(1.0/3.0)*z<=n&&z>=0){
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
//递增输出,一旦不符合后面都不符合,直接中止本层for
//cnt=10201=>cnt=105
else{
break;
}
}
}
//printf("cnt=%d",cnt);
return 0;
}
1.本题踩到两次陷阱
1.1 对1/3与1.0/3.0的概念混淆,导致一直为(1/3)==0,使得输出出错
1.2 使用100-x-y计算z,但是起始忽略了负数的问题,导致500的测试组不通过
2.优化
2.1 使用约束条件去掉第三重循环
2.2 根据递增的输出特性,合理使用break进行中止。
查看25道真题和解析