鸡兔蛇同笼,已知有35个头,94只脚,求鸡兔蛇各几只,是经典数学问题鸡兔同笼的扩展。
鸡有两只脚,兔子四只脚,蛇有零只脚。
可以先抽象成数学式:
这会给我们优化算法带来帮助。
首先通过常规的循环迭代进行求解:
#include <stdio.h>
//鸡兔蛇同笼问题,35个头,94只脚
int main(void){
int x,y,z;
// x鸡,y兔,z蛇
for(x = 0;x <= 35;x++)
for(y = 0;y <= 35;y++)
for(z = 0;z <= 35;z++)
if(x+y+z == 35 && x*2 + y*4 == 94)
printf("鸡%d只,兔%d只,蛇%d只\n",x,y,z);
return 0;
}
输出结果:
鸡1只,兔23只,蛇11只
鸡3只,兔22只,蛇10只
鸡5只,兔21只,蛇9只
鸡7只,兔20只,蛇8只
鸡9只,兔19只,蛇7只
鸡11只,兔18只,蛇6只
鸡13只,兔17只,蛇5只
鸡15只,兔16只,蛇4只
鸡17只,兔15只,蛇3只
鸡19只,兔14只,蛇2只
鸡21只,兔13只,蛇1只
鸡23只,兔12只,蛇0只
因为有三个for循环导致时间复杂度较高,无法进行大规模的运算。
根据数学公式,我们可以得到以下计算式:
因为解y会进行浮点运算,为了避免误差,我们选择先计算x。
x,y转化完成后可得出z最终结果
此时没有了循环的约束条件,if语句中要加入的判断语句输出结果。
优化算法:
#include <stdio.h>
//鸡兔蛇同笼问题,35个头,94只脚,优化算法
int main(void){
int x,y,z;
// x鸡,y兔,z蛇
for(y = 0;y <= 35;y++){
x = 47 - 2 * y;
z = 35 - x - y;
if(x+y+z == 35 && x*2 + y*4 == 94 && x>=0 && y>=0 && z >= 0)
printf("鸡%d只,兔%d只,蛇%d只\n",x,y,z);
}
return 0;
}
输出结果:
鸡23只,兔12只,蛇0只
鸡21只,兔13只,蛇1只
鸡19只,兔14只,蛇2只
鸡17只,兔15只,蛇3只
鸡15只,兔16只,蛇4只
鸡13只,兔17只,蛇5只
鸡11只,兔18只,蛇6只
鸡9只,兔19只,蛇7只
鸡7只,兔20只,蛇8只
鸡5只,兔21只,蛇9只
鸡3只,兔22只,蛇10只
鸡1只,兔23只,蛇11只
因以y起始,所以输出顺序发生了变化,最终结果不变。