喝啤酒:2块一瓶,2空瓶换一瓶,4瓶盖换一瓶,10块钱喝几瓶?
今天老师给我们布置了一道题,题面就是标题了,我第一反应就是分次数来计算:
第一次,买5瓶,(得到5空瓶,5瓶盖);
第二次,可以换3瓶,(剩余4空瓶,4瓶盖);
第三次,可以换3瓶,(剩余3空瓶,3瓶盖);
第四次,可以换1瓶,(剩余2空瓶,4瓶盖);
第五次,可以换2瓶,(剩余2空瓶,2瓶盖);
第六次,可以换1瓶,(剩余1空瓶,3瓶盖);
声明变量:
money:声明钱的数目
beer:存储得到的酒的数量
bottle:存储剩余空瓶的数量
cap:存储剩余瓶盖的数量
在循环体内声明两个变量a,b分别存储每次用瓶子和盖子兑换的酒的数量
判断当剩余空瓶数对2取余和剩余瓶盖数对4取余都为其本身时,跳出循环。详细代码如下:
public class Work07 {
public static void main(String[] args) {
int money = 10; //声明钱的数目
int beer = money/2; //购买得到的酒
int bottle=money/2; //购买得到的空瓶
int cap=money/2; //购买得到的瓶盖
while(true) {
int a =bottle/2; //计算空瓶可兑换数量
int b =cap/4; //计算瓶盖可兑换数量
if(bottle%2==bottle&cap%4==cap) {
break; //当空瓶数对2取余和瓶盖数对4取余的值为它们本身时,结束循环
}else {
//酒总数等于beer+上兑换的a+b
beer = beer + a + b;
//剩余空瓶数等于兑换的酒a+b+上之前空瓶数对2取余的数
bottle = a + b + bottle%2;
cap =a+b+cap%4;
}
}
System.out.println(money + "元钱可以喝" + beer + "瓶酒");
}
}
运行得到:
当我敲完之后觉得可以了的时候,看到了班长的代码,第一反应是好短,出于好奇问班长能不能仔细看下他的代码,班长同意之后我仔细看了下发现他的代码比我简洁许多,大致部分如下(并非班长原代码,而是我根据班长思路复刻的):
public class Demo {
public static void main(String[] args) {
int money = 10;
int bottles = money/2;
for(int i=1;i<=bottles;i++) {
//当能被2整除时说明空瓶有两瓶可以兑换一瓶,喝的酒+1
if( i % 2 == 0) {
bottles++;
}
//当能被4整除时说明瓶盖有4个可以兑换一瓶,喝的酒+1
if(i % 4 ==0) {
bottles++;
}
}
System.out.println(money + "元钱可以喝" +bottles+ "瓶酒");
}
}
运行得到一样的答案。
但是班长的代码长度(除去无代码行)是8,
而我的代码长度是14;
班长声明的变量只有3个,
而我声明的变量为6个
而且思路是明显不同的,班长的思路按我的理解应该是(表达可能有些问题,见谅)
-
因为一瓶酒有一个瓶盖和一个瓶子,所以使用for循环声明一个变量i从1开始逐渐累加
-
当能i被2整除时说明空瓶有两瓶可以兑换一瓶,喝的酒+1
-
当能i被4整除时说明瓶盖有4个可以兑换一瓶,喝的酒+1
-
且由于是累加所以不会重复
-
当这个变量i大于酒的总数,结束循环
-
而最后酒的数量对2取余得到的值为剩下的空瓶数,对4取余得到的值为剩下的瓶盖数
这整个思路给了我很大的启发,一般的思路是先把钱花完买到5瓶,然后用空瓶和瓶盖分别去一轮一轮的换
而班长的思路是先买一瓶,然后判断1瓶喝完能否兑换,不能再买一瓶,然后判断2瓶能否兑换,依次类推直到花完10元钱,且手上的空瓶和瓶盖无法兑换酒时所总共喝到的酒的数量就是10元能喝的酒的总数
买第一瓶:总数1,空瓶1,瓶盖1,不能兑换
买第二瓶:总数2,空瓶2,瓶盖2,可以兑换
用空瓶兑换:总数3,空瓶1,瓶盖3,不能兑换
买第三瓶:总数4,空瓶2,瓶盖4,可以兑换
用空瓶兑换:总数5,空瓶1,瓶盖5,可以兑换
用瓶盖兑换:总数6,空瓶2,瓶盖2,可以兑换
再用空瓶兑换:总数7,空瓶1,瓶盖3,,不能兑换
买第四瓶:总数8,空瓶2,瓶盖4,可以兑换
用空瓶兑换:总数9,空瓶1,瓶盖5,可以兑换
用瓶盖兑换:总数10,空瓶2,瓶盖2,可以兑换
再用空瓶兑换:总数11,空瓶1,瓶盖3,不能兑换
买第五瓶:总数12,空瓶2,瓶盖4,可以兑换
用空瓶兑换:总数13,空瓶1,瓶盖5,可以兑换
用瓶盖兑换:总数14,空瓶2,瓶盖2,可以兑换
用空瓶兑换:总数15,空瓶1,瓶盖3不能兑换
钱花完了,总共喝了15瓶,还剩1空瓶,3空瓶盖
整个过程按数学思维来说肯定是很笨的方法,但是对于编程来说,因为有循环语句 的缘故这种思维却可以让代码很简洁
总结
- 在进行算法编程时不要局限于数学的思维定式,要把编程的结构语句考虑进去如何让程序简洁
- 使用循环时考虑能否使用for循环声明一个变量初始值为1或0开始进行循环,如果可以,是否代码是否相对简洁。
第一次写博客,不怎么会排版,如果有意见或者建议可以在评论区留言