版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 = 0result = i;System.
2、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 = 0result = i;break; /结束循环System.out.println(result;当然,解决这个问题,还有很多其它的方
3、法,这里演示的这两种实现只是最自然的实现而已,采用类似的原理也可以求两个数字的最小公倍数的结构。2、百元百鸡问题问题描述:每只母鸡3元,每只公鸡4元,每只小鸡0.5元,如果花100元钱买100只鸡,请问有哪些可能?说明:每种鸡的数量都可以为零。其实这个问题是数学上的组合问题,只需要把所有的情况列举出来,然后来判断是否符合要求即可。这样的重复列举的问题,在程序上可以使用循环进行解决。第一种思路:当母鸡的数量为0时,公鸡的数量从0-100,当公鸡的数量每变化一次,小鸡的数量就从0变化到100,使用如下数值组合来描述这个思路:母鸡数量公鸡数量小鸡数量0 0 从0变化到1000 1 从0变化到1000
4、 2 从0变化到1001 0 从0变化到1001 1 从0变化到100100 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,以及金额是否为100if(i +j + k = 100 && (i * 3 +
5、j * 4 + k * 0.5 = 100System.out.println(母鸡数量: + i + 公鸡数量: + j + 小鸡数量 + k;按照for语句的执行流程,循环变量变化1,则内部的循环执行一次,而在循环嵌套时,循环体又是一个新的循环,则该循环执行完成的一组循环。这里通过循环的嵌套实现了所有数值的穷举。在循环的内部,只需要按照题目要求判断一下数量和金额是否符合要求即可。但是这样的代码效率比较差,可以通过简单的优化来提高程序的执行效率。第二种思路:由于母鸡每只的金额是3元,所以100元最多购买的母鸡数量是100/3=33只,同理100元最多购买的公鸡数量是25只,而按照100元10
6、0只的要求,小鸡的数量应该为100减去公鸡和母鸡的数量,这样代码就可以简化为如下的结构:for(int i = 0;i <= 33;i+ /母鸡数量for(int j = 0;j <= 25;j+ /公鸡数量int k = 100 i j; /小鸡数量/判断金额是否为100if (i * 3 + j * 4 + k * 0.5 = 100System.out.println(母鸡数量: + i + 公鸡数量: + j + 小鸡数量 + k;这样,就可以大幅提高程序的执行效率,从而提高程序的执行速度。当然该代码还可以继续进行优化,那样可以再次提供程序的执行效率。3 、喝汽水问题问题:
7、共有1000瓶汽水,每喝完后一瓶得到的一个空瓶子,每3个空瓶子又能换1瓶汽水,喝掉以后又得到一个空瓶子,问总共能喝多少瓶汽水,最后还剩余多少个空瓶子?这个问题其实是个比较典型的递推问题,每3个空瓶都可以再换1瓶新的汽水,这样一直递推下去,直到最后不能换到汽水为止。第一种思路:每次喝一瓶,每有三个空瓶子就去换一瓶新的汽水,直到最后没有汽水可以喝为止。在程序中记忆汽水的数量和空瓶子的数量即可。则实现的代码如下:int num = 1000; /汽水数量int drinkNum = 0; /喝掉的汽水数量int emptyNum = 0; /空瓶子的数量while(num > 0 /有汽水可以
8、喝num-; /喝掉一瓶emptyNum+; /空瓶子数量增加1drinkNum+; /喝掉的汽水数量增加1if(emptyNum = 3 /有3个空瓶子,则去换num+; /汽水数量增加1emptyNum = 0; /空瓶子数量清零System.out.println(总共喝掉瓶数: + drinkNum;System.out.println(剩余空瓶子数: + emptyNum;执行该程序,输出结果如下:总共喝掉瓶数:1499剩余空瓶子数:2在该代码中,每次循环喝掉一瓶汽水,则汽水数量减少1,空瓶子数增加1,喝掉的总汽水瓶数增加1,每次判断空瓶子的数量是否达到3,如果达到3则换1瓶汽水,同
9、时空瓶子的数量变为零。这种思路比较直观,但是循环的次数比较多,所以就有了下面的逻辑实现。第二种思路:一次把所有的汽水喝完,获得所有的空瓶子,再全部换成汽水,然后再一次全部喝完,再获得所有的空瓶子,依次类推,直到没有汽水可喝为止。则实现的代码如下:int num = 1000; /汽水数量int drinkNum = 0; /喝掉的汽水数量int emptyNum = 0; /空瓶子的数量while(num > 0 /有汽水可以喝drinkNum += num; /喝掉所有的汽水emptyNum += num; /空瓶子数量等于上次剩余的加上这次喝掉的数量num = emptyNum /
10、3; /兑换的汽水数量emptyNum -= num * 3; /本次兑换剩余的空瓶子数量System.out.println(总共喝掉瓶数: + drinkNum;System.out.println(剩余空瓶子数: + emptyNum;在该代码中,每次喝掉所有的汽水,也就是num瓶,则喝掉的总瓶数每次增加num,因为每次都可能剩余空瓶子(不足3个的,则总的空瓶子数量是上次空瓶子数量加上本次喝掉的num瓶。接着是对话汽水,则每次可以兑换的汽水数量是空瓶子的数量的1/3,注意这里是整数除法,而本次兑换剩余的空瓶子数量是原来的空瓶子数量减去兑换得到汽水数量的3倍,这就是一次循环所完成的功能,依
11、次类推即可解决该问题。4、水仙花数问题:水仙花数指三位数中,每个数字的立方和和自身相等的数字,例如370,3 × 3 × 3 + 7 × 7 × 7 + 0 × 0 × 0 =370,请输出所有的水仙花数。该问题中体现了一个基本的算法数字拆分,需要把一个数中每位的数字拆分出来,然后才可以实现该逻辑。实现思路:循环所有的三位数,拆分出三位数字的个位、十位和百位数字,判断3个数字的立方和是否等于自身。则实现的代码如下所示:for(int i = 100;i < 1000;i+ /循环所有三位数int a = i % 10; /个位数
12、字int b = (i / 10 % 10; /十位数字int c = i / 100; /百位数字/判断立方和等于自身if(a * a * a + b * b * b + c * c * c = iSystem.out.println(i;在该代码中,拆分个位数字使用i和10取余即可,拆分十位数字时首先用i除以十,去掉个位数字,并使原来的十位数字变成个位,然后和10取余即可,因为i是一个三位数,所以i除以100即可得百位数字,因为这里都是整数除法,不存在小数的问题。然后只需要判断立方和是否等于自身即可。注意:因为i是循环变量,这里不能改变i的值,不然可能造成死循环。5 、99乘法表问题:在控
13、制台打印数学上的99乘法表该类问题是发现数字的规律,然后将数值的规律用程序描述出来。实际实现时,可能需要耐心的进行调试。在这里,需要实现数字的多行输出,前面使用的System.out.println是输出内容并换行,后续再输出的内容就再下一行显示,如果需要在输出时不换行,则可以使用System.out.print进行输出。99乘法表的规则是总计9行,每行单独输出,第一行有1个数字,第二行有2个数字,依次类推,数字的值为行号和列号的乘积。实现思路:使用一个循环控制打印9行,在该循环的循环体中输出该行的内容,一行中输出的数字个数等于行号,数字的值等于行号和列号的成绩。实现代码如下:for(int
14、row = 1;row <= 9;row+ /循环行for(int col = 1;col <= row;col+ /循环列System.out.print(row * col;/输出数值System.out.print(' '/输出数字之间的间隔空格System.out.println(;/一行输出结束,换行该程序的输出为:12 43 6 94 8 12 165 10 15 20 256 12 18 24 30 367 14 21 28 35 42 498 16 24 32 40 48 56 649 18 27 36 45 54 63 72 81在该输出中,数字之
15、间的对齐有些问题,第四行和第五行的对齐就很明显。那么如果在输出时想让数字对齐,那么就要首先思考数字为什么不能对齐?则问题直观的出现在有些数字是一位数有些是两位数,发现了原因就可以着手解决了,如果想实现数字的左对齐,则在一位数字的后续多输出一个空格,如果想实现数字的右对齐,则只需要在一位数字的前面输出一个空格即可。以下代码实现了数字的右对齐:for(int row = 1;row <= 9;row+ /循环行for(int col = 1;col <= row;col+ /循环列if(row * col < 10 /一位数System.out.print(' '
16、System.out.print(row * col;/输出数值System.out.print(' '/输出数字之间的间隔空格System.out.println(;/一行输出结束,换行所以在实际书写代码时,代码的位置对于程序逻辑的影响很大,在编写代码时,需要认真考虑代码书写的位置。6 、打印图形问题:在控制台中打印如下格式的图形*由于受到控制台输出的限制,只能按照行的上下,依次进行输出,所以解决打印图形的问题时,只能按照从上到下依次输出每行的内容,关键是仔细观察,发现图形的规律。第一种思路:外部循环循环5次打印5行,每行的内容分为两部分:空格和星号,每行空格的数量是5减去行
17、号个,每行星号的数量是行号的2倍减1个,在外部循环内部先打印空格,再打印星号,每个都只打印1个,使用数量控制对应的打印次数,打印完星号以后换行。则实现的代码如下:for(int row = 1;row <= 5;row+ /循环行/打印空格for(int c1 = 0;c1 < 5 - row;c1+System.out.print(' '/打印星号for(int c2 = 0;c2 < 2 * row - 1;c2+System.out.print('*'/换行System.out.println(;该代码中row的循环用于控制打印的行数,r
18、ow变量的值代表行号,内部的循环体分为三部分:打印空格,打印星号和换行,打印的数量参看图形的规律部分。第二种思路:外部循环循环5次打印5行,内部每行打印的总字符数量是4加行号个,其中前5-行号个字符是空格,后续的字符是星号,所有字符打印完成以后换行。则实现的代码如下:for(int row = 1;row <= 5;row+ /循环行/循环总的字符数for(int col = 0;col < 4 + row;col+if(col < 5 - row /打印空格System.out.print(' 'else /打印星号System.out.print('
19、;*'/换行System.out.println(;该代码的总体思路和第一种思路一样,都是按行打印,只是在考虑问题时首先考虑字符总的数量,把这个数量作为循环次数,内部控制那些该输出字符那些该输出星号即可。7、质数判断问题:判断一个自然数是否是质数。质数指只能被1和自身整除自然数,也称素数,最小的质数是2.对于自然数来说,任何一个数字都可以被1和自身整除。实现思路:利用数学上的反证法进行判断。则问题转换为只需要判断不能被1和自身以外的任何一个数字整除即可。则假设判断的数字是n的话,则这些数字的区间是2,n-1和大于n的所有数字。在数学上n不可能被大于n的数字整除,所以程序只需要判断2,n
20、-1之间的数字即可,如果被该区间的任何一个数字整除了,则说明不是质数。则实现的代码如下:int n = 23;boolean b = true; /存储是否是质数,假设是质数 for(int i = 2;i < n;i+) /如果整除,则不是质数 if(n % i = 0) b = false; break; /输出是否是质数 if(b) System.out.println("是质数"); else System.out.println("不是质数"); 该代码是最容易思考出来的一种实现,其实在数学上只需要判断 n 是否可以被 2 到 n 的 二
21、次方根之间的数字即可。则实现的代码变为如下: int n = 23; boolean b = true; /存储是否是质数,假设是质数 for(int i = 2;i <= Math.sqrt(n);i+) /如果整除,则不是质数 if(n % i = 0) /后续比较没有意义,结束循环 b = false; break; /输出是否是质数 if(b) System.out.println("是质数"); else System.out.println("不是质数"); 通过缩小判断数字的区间,可以显著提高程序的执行效率。说明:这里的 Math.s
22、qrt 的功 能是计算 n 的二次方根。 /后续比较没有意义,结束循环 8、综合练习 本部分是一些整理的关于流程控制部分的综合练习, 可以通过这些练习熟悉 Java 语言的 基本语法,以及锻炼逻辑思维能力。 练习题:1、 计算数字 12 和 18 的最小公倍数。 2、 如果苹果 1 元/个, 桔子 2 元/个, 芒果 4 元/个,若是用 10 元去买,有几种组合 呢 x+2*y+4*z=10 3、 一只猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天 早上又将剩下的桃子吃掉一半, 又多吃了一个。 以后每天早上都吃了前一天剩下的一半零一 个, 第 10 天早上想再吃时, 发现
23、只剩下一个桃子了。 请问猴子第一天一共摘了多少个桃子? public class Peach1 public static void main(Stringargs int total = 1; int day = 10; for(int i = 10;i > 0;i- System.out.println("第"+day+"天,有桃子"+total+"颗" total = (total + 1 * 2; day-; 方法二: java import java.util.Scanner; /*题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一 个 * 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。 * 以后每天早上都吃了前一天剩下 的一半零一个。 * 到第 10 天早上想再吃时,见只剩下一个桃子了。求第 n 天共还有多少桃子。 1.程序分析:采取逆向思维的方法,从后往前推断。 */ pu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 洁具工地供货合同范例
- 绍兴小型仓库租赁合同模板
- 碗柜制作合同范例
- 流动泡沫转让合同范例
- 纺织纱线耗材采购合同范例
- 电销外包合同模板
- 晚会执行合同范例
- 雇佣大车合同范本
- 网版购销合同模板
- 相城区房屋转让合同范例
- 急性脑梗塞护理查房1课件
- 实用针灸学-经络养生与康复-暨南大学中国大学mooc课后章节答案期末考试题库2023年
- 沥青路面用木质素纤维检测原始记录
- 0~3岁儿童亲子活动设计与指导(高职学前教育)PPT完整全套教学课件
- 化脓性脑膜炎英文
- 消防演练制度规定
- 龈下刮治术-课件
- 2023燃气安全生产管理人员考试题及答案(200题)
- 统编版小学道德与法治三年级上册心中的“110”--有点警惕性课件
- 读后续写户外惊险之迷路讲义-2023届高三英语写作专项
- 统计分析报告的写作技巧课件
评论
0/150
提交评论