Java编程那些事儿39—流程节制综合示例
副标题#e#
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);
虽然,办理这个问题,尚有许多其它的要领,这里演示的这两种实现只是最自然的实现罢了,回收雷同的道理也可以求两个数字的最小公倍数的布局。
#p#副标题#e#
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);
}
}
}
}
#p#分页标题#e#
凭据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);
}
}
}
}
这样,就可以大幅提高措施的执行效率,从而提高措施的执行速度。虽然该代码还可以继承举办优化,那样可以再次提供措施的执行效率。