2022-1-17 每日一题 NewCoder KY156 百鸡问题
题目描述:
链接:https://www.nowcoder.com/practice/01d161052db64c249a47fc723b4fd5db
解题思路:
解法1:菜鸟版
x,y,z对应三重循环,根据n值 设置上限,条件满足 100只,并且总金额<=n
知识点总结:
1.对小数的处理:
- 等式两边同时 乘以3(消除小数)
推荐
- 或者使用 1.0/3 或 1/3.0 强转为浮点型(保留小数后几位)
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
while(cin >> n){
for(int x = 0; x <= n / 5; ++x)
for(int y = 0; y <= n / 3; ++y)
for(int z = 0; z <= n * 3; ++z){
if(x + y + z == 100 && 15 * x + 9 * y + z <= 3 * n){
printf("x=%d,y=%d,z=%d\n", x, y, z);
}
}
}
return 0;
}
解法2:更优解法
优化代码总结:
1.减少嵌套循环:使用x,y计算z值,即z=100-x-y
注意:z为非负数,所以注意x,y循环上限!!!
2.适当缩小循环次数
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,x,y,z;
while(scanf("%d",&n)!=EOF)
{
for(x=0; x<=n/5; x++){//x上限可以为n/5
for(y=0; y<=100-x; y++){//y上限只能由100-x表示
z=100-x-y;//注意:z为非负数!!!所以此时z最小为0,即y=100-x,z=y-y=0
if(x*5 + y*3 + z/3.0 <= n)
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
}
}
return 0;
}