Java编程那些事儿39—流程控制综合示例1
郑州游戏学院陈跃峰
5.6 综合示例
在一般的学校学习流程控制时,重点是放在流程控制的相关语法,其实为了能成为一个合格的程序员,仅仅学好语法是远远不够的,还需要通过大量的练习来适应程序设计语言的思维方式,并且熟练地把自己的解决问题的步骤形成代码,这些都需要通过大量的阅读代码和编写代码来实现。
所以在学习流程控制时,重点是解决实际的问题,而不是仅仅停留在语法层面上,这个是很多在校学生学习程序时最突出的一个问题。
在遇到一个实际问题时,首先要能够思考出解决这个问题的数学步骤或逻辑步骤,然后才能编写对应的代码,所以遇到实际问题是,一定要积极思考,并且善于思考,对于一个相同的问题,不同的逻辑就可以写出不同的代码,所以在思考解决问题的方式时,需要进行发散性的思维,而这些理性的思维很多都是建立在数学基础以及对语法的熟悉基础之上。
下面,通过一系列的实际问题,来说明解决实际问题的步骤以及书写的对应的代码。
5.6.1 示例讲解
5.6.1.1 最大公约数
问题:求两个自然数的最大公约数。
这两个都是基础的数学问题,最大公约数指两个数字公共的约数中最大的,例如数字6的约数有1、2、3、6,数字9的约数有1、3、9,则数字6和数字9的公共约数有1和3,其中3是最大的公约数。
第一种思路:从1开始循环,每次把符合要求(即同时是两个数字的约数)的值都存储起来,那么最后一个存储起来的就是最大的约数。
则实现的代码如下:
int n = 6;
int m = 9;
int result = 1;
for(int i = 1;i <= n;i++){
if((n % i == 0) && (m % i == 0)){
result = i;
}
}
System.out.println(result);
使用该思路,每次都存储得到的公共约数,那么最后一个存储的就是两个数字的最大公约数。
第二种思路:从两个数字中最小的数字开始循环,每次减1,那么第一次得到的公共约数就是所求的最大公约数。
则实现的代码如下:
int n = 6;
int m = 9;
int result = n > m ?m : n;
for(int i = result;i >= 1;i--){
if((n % i == 0) && (m % i == 0)){
result = i;
break;//结束循环
}
}
System.out.println(result);
当然,解决这个问题,还有很多其它的方法,这里演示的这两种实现只是最自然的实现而已,采用类似的原理也可以求两个数字的最小公倍数的结构。
5.6.1.2 百元百鸡问题
问题描述:每只母鸡3元,每只公鸡4元,每只小鸡0.5元,如果花100元钱买100只鸡,请问有哪些可能?说明:每种鸡的数量都可以为零。
其实这个问题是数学上的组合问题,只需要把所有的情况列举出来,然后来判断是否符合要求即可。这样的重复列举的问题,在程序上可以使用循环进行解决。
第一种思路:当母鸡的数量为0时,公鸡的数量从0-100,当公鸡的数量每变化一次,小鸡的数量就从0变化到100,使用如下数值组合来描述这个思路:
母鸡数量 公鸡数量 小鸡数量
0 0 从0变化到100
0 1 从0变化到100
0 2 从0变化到100
……
1 0 从0变化到100
1 1 从0变化到100
……
100 100 100
上面列举出了所有公鸡、母鸡和小鸡的数量都是0-100时的所有组合,总计是101的三次方种,这样的穷举结构直接存在嵌套,在程序实际实现时,通过循环之间的嵌套就可以实现,则实现的代码如下:
for(int i = 0;i <= 100;i++){//母鸡数量
for(int j = 0;j <= 100;j++){ //公鸡数量
for(int k = 0;k <= 100;k++){ //小鸡数量
//判断数量是否为100,以及金额是否为100
if((i +j + k == 100) && (i * 3 + j * 4 + k * 0.5 == 100)){
System.out.println(“母鸡数量:” + i + “ 公鸡数量:” + j + “ 小鸡数量” + k);
}
}
}
}
按照for语句的执行流程,循环变量变化1,则内部的循环执行一次,而在循环嵌套时,循环体又是一个新的循环,则该循环执行完成的一组循环。这里通过循环的嵌套实现了所有数值的穷举。在循环的内部,只需要按照题目要求判断一下数量和金额是否符合要求即可。
但是这样的代码效率比较差,可以通过简单的优化来提高程序的执行效率。
第二种思路:由于母鸡每只的金额是3元,所以100元最多购买的母鸡数量是100/3=33只,同理100元最多购买的公鸡数量是25只,而按照100元100只的要求,小鸡的数量应该为100减去公鸡和母鸡的数量,这样代码就可以简化为如下的结构:
for(int i = 0;i <= 33;i++){//母鸡数量
for(int j = 0;j <= 25;j++){ //公鸡数量
int k = 100 –i – j;//小鸡数量
//判断金额是否为100
if (i * 3 + j * 4 + k * 0.5 == 100){
System.out.println(“母鸡数量:” + i + “ 公鸡数量:” + j + “ 小鸡数量” + k);
}
}
}
}
这样,就可以大幅提高程序的执行效率,从而提高程序的执行速度。当然该代码还可以继续进行优化,那样可以再次提供程序的执行效率。
分享到:
相关推荐
本书按照技术学习的顺序,依次介绍了计算机基础知识、建立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
java示例练习java示例练习java示例练习java示例练习java示例练习
Java 并发编程示例测试 concurrent包下的测试
sun 公司规范的 JAVA编程规范与范例 很详细 开发很实用
第02章 Java编程基础 07 逻辑运算符与示例
分别实现生产者-消费者模式和发布-订阅模式,作为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 ...
Java安全性编程示例(含源码),讲得很详细,推荐使用~~~~
显示MFC框架的MDI编程,其中代码的注释非常详细,如果你按照本人在“VC++的那些事儿”中描述的学习思想去学习,应该对VC++编程的代码阅读大有收获。自定义类的代码类几乎是一行注释一行代码,MFC框架的生命周期的...