喝啤酒:2块一瓶,2空瓶换一瓶,4瓶盖换一瓶,10块钱喝几瓶?

本文通过一道有趣的数学题——喝啤酒,探讨如何利用编程解决此类问题。博主分享了两种不同思路的解决方案,一种是分步骤计算,另一种是使用循环变量直接累加。尽管数学上看似复杂,但利用编程的循环结构,可以实现简洁的代码。文章强调在编程解题时不应拘泥于数学思维,要充分利用编程语言的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

喝啤酒: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空瓶盖

整个过程按数学思维来说肯定是很笨的方法,但是对于编程来说,因为有循环语句 的缘故这种思维却可以让代码很简洁

总结

  1. 在进行算法编程时不要局限于数学的思维定式,要把编程的结构语句考虑进去如何让程序简洁
  2. 使用循环时考虑能否使用for循环声明一个变量初始值为1或0开始进行循环,如果可以,是否代码是否相对简洁。

第一次写博客,不怎么会排版,如果有意见或者建议可以在评论区留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值