郑州游戏学院—陈跃峰老师的博客

人生难得几回博,来,让我们博一把

陈跃峰ID:Mailbomb
749198次访问,排名46好友103人,关注者343
努力学习,努力工作
Mailbomb的文章
原创 284 篇
翻译 12 篇
转载 11 篇
评论 1309 篇
陈跃峰的公告
陈跃峰 个人简历
cqucyf@gmail.com

本BLOG中文章,未经允许严禁用于商业目的!

本人编写的J2ME基础入门书籍: 《新编J2ME就业培训教程》,购买
dearbook
华储网
当当网
Chinapub
最近评论
bijat:太高兴了,今天的第一个j2me编译好了,向陈老师致敬!
bijat:太感谢陈老师了,写的太详细了,我终于编译好了我的第一个java,致敬!
onemonth:楼主,求你不要写了吧。如果非要写,换个名字。明朝那些事是很好的文章,你就不要糟蹋了这样的名字。
lunarfan:杨辉的算法不错。
panzhiqian11:kankan xuexi.
文章分类
收藏
    相册
    J2ME技术
    J2ME开发网
    无线空间
    Java网站
    Eclipse官方网站
    Java世纪网
    Sun中国
    Sun官方网站
    常用网站
    Chinabyte
    Google搜索引擎
    华军软件园
    新浪新闻
    网上书店
    ITbook
    互动出版网
    当当书店
    第二书店
    我工作过的地方
    上海托普信息技术学院
    游戏学院南京校区
    游戏学院郑州校区
    电脑报
    友情链接
    acqy的专栏
    eiyaa的专栏
    上海求职客栈
    刀剑啸的专栏
    刘军的BLOG
    王新钢的BLOG
    贝壳鱼(k7sem)专栏
    骄傲的猫
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Java编程那些事儿39—流程控制综合示例1收藏

    新一篇: Java编程那些事儿40—流程控制综合示例2 | 旧一篇: Java编程那些事儿38—break和continue语句

     
    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);
                                                   }
                                         }
                                }
                       }
             这样,就可以大幅提高程序的执行效率,从而提高程序的执行速度。当然该代码还可以继续进行优化,那样可以再次提供程序的执行效率。

    发表于 @ 2008年06月19日 12:30:56|评论(loading...)|收藏

    新一篇: Java编程那些事儿40—流程控制综合示例2 | 旧一篇: Java编程那些事儿38—break和continue语句

    评论

    #whx800 发表于2008-06-19 18:19:27  IP: 60.25.77.*
    请问。 java中的静态方法能被覆盖么?我看很多地方说不能,但是我在编译器下,在子类中写了同样签名的方法,只是行为不同,为什么可以运行呢?
    2008-06-19 20:34:23作者回复
    但是功能和非静态的不一样,你写个代码实验实验
    #muyuqian 发表于2008-07-08 20:39:54  IP: 220.178.19.*
    问题描述:每只母鸡3元,每只公鸡4元,每只小鸡0.5元,如果花100元钱买100只鸡,请问有哪些可能?说明:每种鸡的数量都可以为零。

    用你提供的两种方法,反而求不出数量为零的组合.
    我稍微改变了一下,似乎可以.
    for(int i = 0;i <= 33;i++){//母鸡数量
    for(int j = 0;j <= 25;j++){ //公鸡数量
    for(int k = 0; k <=100 - i - j; k++){ //小鸡数量
    //判断金额是否为100
    if (i * 3 + j * 4 + k * 0.5 == 100){
    System.out.println("母鸡数量:"+ i + " 公鸡数量:"+ j + " 小鸡数量:"+ k);
    }
    }
    }
    }
    2008-07-09 17:20:49作者回复
    题目有2个要求:1、买100只鸡;2、花100元钱
    #muyuqian 发表于2008-07-10 15:38:33  IP: 220.178.19.*
    不好意思,是我看错题义了.谢谢指正.
    #geforcesdn 发表于2008-08-22 16:39:35  IP: 121.43.227.*
    循环的嵌套
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 陈跃峰