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

说明:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,问如何用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次就得出了结果,提高了效率。
所以使用程序解决一个数学问题,首先还是要对问题进行充分的分析,

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