`

Java编程那些事儿40—流程控制综合示例2

阅读更多
Java编程那些事儿40—流程控制综合示例2
郑州游戏学院陈跃峰
5.6.1.3 喝汽水问题
问题:共有1000瓶汽水,每喝完后一瓶得到的一个空瓶子,每3个空瓶子又能换1瓶汽水,喝掉以后又得到一个空瓶子,问总共能喝多少瓶汽水,最后还剩余多少个空瓶子?
这个问题其实是个比较典型的递推问题,每3个空瓶都可以再换1瓶新的汽水,这样一直递推下去,直到最后不能换到汽水为止。
第一种思路:每次喝一瓶,每有三个空瓶子就去换一瓶新的汽水,直到最后没有汽水可以喝为止。在程序中记忆汽水的数量和空瓶子的数量即可。
则实现的代码如下:
int num = 1000; //汽水数量
int drinkNum = 0; //喝掉的汽水数量
int emptyNum = 0;//空瓶子的数量
while(num > 0){ //有汽水可以喝
num--; //喝掉一瓶
emptyNum++;//空瓶子数量增加1
drinkNum++; //喝掉的汽水数量增加1
if(emptyNum == 3){//有3个空瓶子,则去换
num++; //汽水数量增加1
emptyNum = 0; //空瓶子数量清零
}
}
System.out.println(“总共喝掉瓶数:” + drinkNum);
System.out.println(“剩余空瓶子数:” + emptyNum);
执行该程序,输出结果如下:
总共喝掉瓶数:1499
剩余空瓶子数:2
在该代码中,每次循环喝掉一瓶汽水,则汽水数量减少1,空瓶子数增加1,喝掉的总汽水瓶数增加1,每次判断空瓶子的数量是否达到3,如果达到3则换1瓶汽水,同时空瓶子的数量变为零。这种思路比较直观,但是循环的次数比较多,所以就有了下面的逻辑实现。
第二种思路:一次把所有的汽水喝完,获得所有的空瓶子,再全部换成汽水,然后再一次全部喝完,再获得所有的空瓶子,依次类推,直到没有汽水可喝为止。
则实现的代码如下:
int num = 1000; //汽水数量
int drinkNum = 0; //喝掉的汽水数量
int emptyNum = 0; //空瓶子的数量
while(num > 0){ //有汽水可以喝
drinkNum += num;//喝掉所有的汽水
emptyNum += num; //空瓶子数量等于上次剩余的加上这次喝掉的数量
num = emptyNum / 3;//兑换的汽水数量
emptyNum -= num * 3;//本次兑换剩余的空瓶子数量
}
System.out.println(“总共喝掉瓶数:” + drinkNum);
System.out.println(“剩余空瓶子数:” + emptyNum);
在该代码中,每次喝掉所有的汽水,也就是num瓶,则喝掉的总瓶数每次增加num,因为每次都可能剩余空瓶子(不足3个的),则总的空瓶子数量是上次空瓶子数量加上本次喝掉的num瓶。接着是对话汽水,则每次可以兑换的汽水数量是空瓶子的数量的1/3,注意这里是整数除法,而本次兑换剩余的空瓶子数量是原来的空瓶子数量减去兑换得到汽水数量的3倍,这就是一次循环所完成的功能,依次类推即可解决该问题。
5.6.1.4水仙花数
问题:水仙花数指三位数中,每个数字的立方和和自身相等的数字,例如370,3 × 3 × 3 + 7 × 7 × 7 + 0 × 0 × 0 =370,请输出所有的水仙花数。
该问题中体现了一个基本的算法——数字拆分,需要把一个数中每位的数字拆分出来,然后才可以实现该逻辑。
实现思路:循环所有的三位数,拆分出三位数字的个位、十位和百位数字,判断3个数字的立方和是否等于自身。
则实现的代码如下所示:
for(int i = 100;i < 1000;i++){ //循环所有三位数
int a = i % 10; //个位数字
int b = (i / 10) % 10; //十位数字
int c = i / 100; //百位数字
//判断立方和等于自身
if(a * a * a + b * b * b + c * c * c == i){
System.out.println(i);
}
}
在该代码中,拆分个位数字使用i和10取余即可,拆分十位数字时首先用i除以十,去掉个位数字,并使原来的十位数字变成个位,然后和10取余即可,因为i是一个三位数,所以i除以100即可得百位数字,因为这里都是整数除法,不存在小数的问题。然后只需要判断立方和是否等于自身即可。
注意:因为i是循环变量,这里不能改变i的值,不然可能造成死循环。
分享到:
评论

相关推荐

    Java编程那些事儿55—方法重载和参数传递

    ### Java编程那些事儿55—方法重载和参数传递 #### 方法重载(Overloading) 在Java编程语言中,**方法重载**(Overloading)是一个非常重要的概念,它允许我们定义多个具有相同名称但参数列表不同的方法。这种方法...

    java那些事儿

    通过阅读《Java编程那些事儿》并结合代码示例,初学者可以动手编写简单的程序,逐步建立起对Java语言的理解。同时,熟悉软件下载和安装的过程也是提升技能的重要步骤,因为这将帮助他们更好地搭建和管理开发环境。 ...

    针对“VC++的那些事儿”的MDI应用示例

    显示MFC框架的MDI编程,其中代码的注释非常详细,如果你按照本人在“VC++的那些事儿”中描述的学习思想去学习,应该对VC++编程的代码阅读大有收获。自定义类的代码类几乎是一行注释一行代码,MFC框架的生命周期的...

    Java那些事儿之(一)读取property配置文件

    在Java编程中,管理应用程序的配置参数是一项至关重要的任务。`properties`文件是Java中用于存储配置信息的标准格式,它以键值对的形式保存数据,易于读写且跨平台兼容。本文将深入探讨如何在Java中读取和操作`...

    Java开源项目之「自学编程之路」

    这个项目不仅涵盖了基础理论,还包括实战经验和技术文章,帮助你更好地理解和掌握Java编程。 首先,学习Java编程的基础至关重要。这包括理解基本语法、数据类型、控制结构(如if语句和循环)、类与对象的概念,以及...

    java文集

    ext学习笔记一 小试iBatis RIA(Rich Internet Application)的现状和未来 Java应用中域名解析不过期的解决方法 Java编程那些事儿45—数组使用示例1 一步步熟悉OFBiz 用Java做客户端调用.NET写...

    租房系统静态页面供java初学者用来学习

    2. **Java JSP**:JavaServer Pages技术用于服务器端编程,与前端HTML页面结合,处理动态内容需求。 3. **静态页面与动态页面**:静态页面只包含预定义的内容,不进行服务器交互;动态页面根据用户请求动态生成内容...

    Java gui简单程序

    在Java编程领域,GUI(图形用户界面)是创建桌面应用程序不可或缺的一部分。本示例程序"Java GUI简单程序"旨在教你如何构建一个基本的GUI界面,同时整合数据库连接、查询功能,并利用JTable来展示查询结果。这是一个...

    人工智能-动物产生式系统代码.c

    选择c、c++、java等编程语言编写程序,采用基于产生式规则的知识表示方法,正向推理或反向推理机制,根据用户给出的动物特征,实现对动物的自动识别。要求知识库与控制系统相互独立,系统完成后除了能识别已有的7种...

    JTree 更新版 不错的树形控件

    压缩包中的“JTree”文件可能是一个包含了示例代码或者更新后JTree类的Java源文件。为了更好地理解这个更新版JTree控件的工作方式,你可以检查这个文件,查看其中的方法和类,看看它们是如何扩展和优化了标准JTree的...

    labuladong的刷题三件套.zip

    这些题目通常会有详细的解题思路和代码示例,帮助学习者深入理解概念,并提升实际编程能力。 在学习和实践过程中,理解每种数据结构的特点和适用场景,以及各种算法的时间复杂度和空间复杂度,是非常重要的。通过...

    EasyUI API中文版

    - 示例代码:通过官方示例和社区分享的代码,可以快速上手和解决问题。 - 在线论坛和问答社区:如Stack Overflow等,是寻求帮助和交流经验的好地方。 总的来说,EasyUI 提供了一套完整的前端解决方案,使得开发者...

Global site tag (gtag.js) - Google Analytics