利用JAVA实现“百鸡百钱”问题

题目:公鸡5元一只,母鸡3元一只,3只小鸡1元,如果用100元钱,买100只鸡,不佘不欠,可以买公鸡,母鸡,小鸡,各多少只。

分析

这个问题可以说是高级语言中的经典问题了,利用简单的算法和逻辑来解决简单的数学问题是可以用基本语法可以解决的。

我们先假设都买公鸡,100元最多只能买20只公鸡,绝对不可能达到100只。假如100元都买母鸡,最多只能买到33.333333333333…..只母鸡(可怜最后的三分之一只),这也是很明显不存在的。。。

这里其实用到了”假设极限”的思想(是不是瞬间觉得高大上了呢?),利用这种思想我们可以确定循环体的上界。

根据上面所说的,在钱数为100元的前提下,公鸡最多只能买到20只,这里就要用到for()循环体了,循环变量则为公鸡的数量。将从买1只公鸡一直到买20只公鸡作为最外层的循环,我们在从买1只公鸡,一直到买20只公鸡作为第二个前提条件(第一个前提条件为总金额一定是100),这样我们在考虑下一层循环。

for(rooster=1;rooster<=20;rooster++){}  

在第二层循环中,我们依旧会使用for()循环体,用母鸡的个数作为循环变量。因为我们由最开始的分析得知,母鸡最多只能买到33.33333..只,这样我们在只有100元的前提下,最多只能买到33只整鸡,这当然也是远不能满足我们的条件的,但是因为这里是第二层循环,我们可以最外层循环(也就是“公鸡”循环)相互匹配,从而找到花100元买100只鸡的方法。

for(rooster=1;rooster<=20;rooster++){
for(hen=1;hen<=33;hen++){
}
}

这里所用到的思想是”组合”思想,其实循环结构嵌套就是各种组合的尝试(因为专业的缘故,我更喜欢叫它“X、Y扫描行为”),说白了就是在确定外层循环的某一数值下,内层循环全部循环完毕之后,再在外层循环变量上变换,之后再跳到内层循环继续循环完毕内部循环,再跳到外层。。。。。。。以此类推,直到外层循环条件不再满足,既可以跳出整个循环,得到我们想要的结果。

   chick=100-rooster-hen;

这里的chick变量就是小鸡的数量。而在之后的if()条件语句中,利用题目规定的”花费总金额为100元”以及”小鸡的数量一定能被3整除”作为判断条件,可以列出下列判断语句

if(5*rooster+3*hen+(1.0/3)*chick==100 && chick%3==0)

这两个条件必须是同时成立才能达到题目的要求。
这样一来问题便迎刃而解了。

实验

以下是我第一次编程时的源代码

package com.tencentos;
public class Week1homework2 {
public static void main(String[] args) {
    int rooster,hen,chick;
    for(rooster=1;rooster<=20;rooster++){
        for(hen=1;hen<=33;hen++){
            chick=100-rooster-hen;
            if(5*rooster+3*hen+(1/3)*chick==100 && chick%3==0){
                System.out.println("rooster:"+rooster+"\then:"+hen+"\t  chick:"+chick);
            }
            }
        }
    }
}
}

而后输出的结果为
这里写图片描述

乍一眼看上去感觉没有错误,但是凭借我多年的高(加)数(减)经验一下子就发现了,答案是错的。
因为8*5+20*3=100,等于后面的小鸡数量虽然能被3整除,但是完全没有用上。下面所得到的结果也是一样的情况。

猛然间反应过来,一定是判断语句中chick那一项等于0了。

果不其然,我犯了初学者都会遇到的错误

if(5*rooster+3*hen+(1/3)*chick==100 && chick%3==0)

在运算使用if()条件句计算1/3的时候,因为1与3都为int类型,并且chick也在开始时被我定义为了int类型,这样一来当运算1/3的时候,结果只会是int类型的0值,从而运算的结果无论chick的值多少,都会使得chick的价钱花费了0元。

至于解决的办法,想了一下应该将式子中的1或3改为1.0或3.0,并且将chick定义为double类型,这样一来在当数值类型转换的时候,小范围的int类型就被转换为了double类型,这样的话计算1.0/3.0时,就不会得到0的返回值了。所以正确的源程序如下

package com.tencentos;
public class Week1homework2 {
public static void main(String[] args) {
    int rooster,hen;
    double chick;
    for(rooster=1;rooster<=20;rooster++){
        for(hen=1;hen<=33;hen++){
            chick=100-rooster-hen;
            if(5*rooster+3*hen+(1.0/3.0)*chick==100 && chick%3==0){
                System.out.println("rooster:"+rooster+"\then:"+hen+"\t  chick:"+chick);
            }
        }
    }
}
}

得到此题的正确解为

这里写图片描述

Enjoy it~

  • 18
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值