百钱买百鸡问题

百钱买百鸡问题

题目:公元前5世纪末,中国古代数学家张丘建在他的《算经》中提出了著名的 “百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?即一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,雏鸡一钱3只,问一百只鸡中公鸡、母鸡、雏鸡各多少?

三种解法

O(n)

思路:利用高中的参数方程求解

copy
/** * x + y + z = 100 * 5 * x + 3 * y + z / 3 =100 * 引用参数t来表示 x、y、z得: * * x = ( 4 * t - 300 ) / 3 ① * y = ( 600 - 7 * t ) / 3 ② * z = t ③ * * 有①②得: * 4 * t >= 300 ④ * 600 - 7 * t >= 0 ⑤ * * ④⑤可得 * 75 =< t <86 */ public static void way1(){ //O(n) //公鸡数量:x 母鸡数量:y 雏鸡数量:z int x,y,z; //先确定雏鸡数量范围 然后反确定公鸡母鸡数量 for (int t = 75; t < 86 ; t++){ x = ( 4 * t - 300 ) / 3; y = ( 600 - 7 * t ) / 3; z = t; //输出符合题目中两个公式的x、y、z if ((5 * x + 3 * y + z / 3 == 100) && (x + y + z == 100)){ System.out.println("公鸡:"+x+" 母鸡:"+y+" 雏鸡:"+z); } } }

O(n**2)

思路:确定公鸡和母鸡,然后用体中的两个公式代换

copy
public static void way2(){ //O(n**2) //公鸡数量:x 母鸡数量:y 雏鸡数量:z int x,y,z; //公鸡最多买20只 for (x=0;x<=20;x++){ //母鸡最多买33只 for(y=0;y<=33;y++){ //雏鸡和公鸡母鸡关系 z=100-x-y; //雏鸡数量一定是三的倍数,且三种鸡一共百钱 if (5*x+3*y+z/3==100 && z%3==0){ System.out.println("公鸡:"+x+" 母鸡:"+y+" 雏鸡:"+z); } } } }

O(n**3)

思路:公鸡母鸡雏鸡都全循环一遍

copy
public static void way3(){ //O(n**3) //公鸡数量:x 母鸡数量:y 雏鸡数量:z int x, y, z; //公鸡最多买20只 for (x = 0; x < 20; x++) { //母鸡最多买33只 for (y = 0; y < 33; y++) { //雏鸡最多买300只 for (z = 3; z < 300; z = z + 3) { //找到符合这两个公式的x、y、z if ((5 * x + 3 * y + z / 3 == 100) && (x + y + z == 100)) { System.out.println("公鸡数:" + x + "母鸡数" + y + "小鸡数" + z); } } } } }
posted @   不吃紫菜  阅读(955)  评论(0编辑  收藏  举报
相关博文:
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起