百钱买百鸡
问题:“鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一”.
说明:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,问如何用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次就得出了结果,提高了效率。
所以使用程序解决一个数学问题,首先还是要对问题进行充分的分析,
可以将问题转化为另外一种形式,使程序更加简洁和容易实现,何乐而不为呢?