zoukankan      html  css  js  c++  java
  • 百钱买百鸡

    问题:“鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一”.

    说明:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,问如何用100钱买100只鸡?

    设公鸡、母鸡、鸡雏分别值x,y,z钱。

    a.算法一:穷举法

    则:

      1<= x <=19,

      1<= y <=32,

      3<= z <=98(步长为3)

    穷举法求解:

    代码

    1 for(int x=1;x<=19;x++)
    2   for(int y=1;y<=32;y++)
    3     for(int z=3;z<=98;z+=3)    //步长为3
    4     {
    5          if( x+y+z==100 && 5*x+3*y+z/3==100 )  //百钱百鸡条件
    6          {
    7             printf("%d %d %d",x,y,z);
    8          }
    9     }

      穷举法遍历了所有可能出现的情况,最终也可以得到正确的结果,这是发挥了计算机的快速运算的能力,
    但是这样子把问题全部抛给计算机去处理并不是我们所追求的,在这个问题上,其实可以让循环层数减少

    到一层,我们知道“百钱买百鸡”这个问题的两个条件需要满足,第一个就是钱数为100,另一个为鸡数为100,

    在算法一上我们是将这个条件放到了程序中去判断(if( x+y+z==100 && 5*x+3*y+z/3==100 )),

    在算法二我将先将这两个条件的方程式组合成方程组,然后将方程组化简,最终再通过程序解决问题。

    b.算法二:化简方程组

    方程组:

      x+y+z=100,

      5x+3y+z/3=100

    将上式整理得:

      y=25-7x/4,

      z=75+3x/4

    x,y,z需要满足上式,并且通过式子可知x必须要为4的整数倍。

    代码:

    for(int x=4;x<=19;x+=4)
    {
       y=25-7*x/4;
       z=75+3*x/4;
       if( y>0 && z<=98 )
         printf("%d %d %d",x,y,z);
    }

      算法二只循环了4次就得出了结果,提高了效率。
    所以使用程序解决一个数学问题,首先还是要对问题进行充分的分析,

    可以将问题转化为另外一种形式,使程序更加简洁和容易实现,何乐而不为呢?

  • 相关阅读:
    HDU1312 ZOJ2165 Red and Black
    HDU1312 ZOJ2165 Red and Black
    HDU1181 变形课【DFS】
    codevs1017 乘积最大
    codevs1220 数字三角形
    codevs1169 传纸条
    codevs1219 骑士游历
    codevs1010 过河卒
    codevs1166 矩阵取数游戏
    codevs1154 能量项链
  • 原文地址:https://www.cnblogs.com/miaosha5s/p/4143527.html
Copyright © 2011-2022 走看看