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开发环境、Java基础语法、流程控制使用、数组使用、方法使用等编程基础知识,然后介绍了面向对象编程、JDK API结构、I/O技术、多线程技术、网络编程技术...
JAVA界面编程示例,包含很多小实例...对Java初学者来说,是很好的学习资料
本代码系Java网络编程(第四版)示例代码,包括多线程编程示例代码,URL/RUI编程示例代码,HTTP编程示例代码,Socket编程示例代码和UDP编程示例代码
Java网络编程简单示例,HTTP,URLConnection,
java编程思想书本示例和习题答案,包括书本的讲解的例子还有课后的习题答案,很全面
Java编程代码实例集锦.Java编程代码实例集锦.Java编程代码实例集锦.Java编程代码实例集锦.chm
java网络编程示例 实现客户机和服务器功能,客户机向服务器发送一条信息,服务器将所有信息转发给所有客户机
根据JavaScript DOM 编程艺术这本书之前所介绍的内容,做的本书最后的一个综合简单示例
Java编程进阶经典,英文版本可以在觉得中文版翻译不堪入目理解困难的时候对照,附有代码
Java编程示例,https://download.csdn.net/download/fulidang/10621469
北大青鸟S2使用Java实现面向对象编程2章
Java 并发编程示例测试 concurrent包下的测试
java示例练习java示例练习java示例练习java示例练习java示例练习
sun 公司规范的 JAVA编程规范与范例 很详细 开发很实用
第02章 Java编程基础 07 逻辑运算符与示例
环境:Window XP sp3, JDK 1.6, MyEclipse 5.5 运行步骤: 1、下载解压之后,使用...本示例一行注释一行代码,非常详细的说明了怎样使用Java 2D API来编写Java动画应用。 阅读对象:非常熟悉Java基本概念的人员
分别实现生产者-消费者模式和发布-订阅模式,作为java编程发送消息和消费消息的基础示例。 源码主要包含如下内容: 1.spring boot配置初始化activeMQ 2.队列类型queue,生产者发送队列消息,以及消费者消费相关队列...
设计模式示例代码(java)设计模式示例代码(java)v设计模式示例代码(java)设计模式示例代码(java)设计模式示例代码(java)设计模式示例代码(java)设计模式示例代码(java)设计模式示例代码(java)设计模式示例代码(java)...
java核心编程(core java)第十版原书相关示例代码,包括第一卷和第二卷,有需要的下。
import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public class Server extends ServerSocket { private static ArrayList User_List = new ArrayList(); private static ...