百钱买百鸡问题
百钱买百鸡问题
题目:公元前5世纪末,中国古代数学家张丘建在他的《算经》中提出了著名的 “百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?即一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,雏鸡一钱3只,问一百只鸡中公鸡、母鸡、雏鸡各多少?
三种解法
O(n)
思路:利用高中的参数方程求解
/**
* 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)
思路:确定公鸡和母鸡,然后用体中的两个公式代换
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)
思路:公鸡母鸡雏鸡都全循环一遍
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);
}
}
}
}
}
本文来自博客园,作者:不吃紫菜,遵循CC 4.0 BY-SA版权协议,
转载请附上原文出处链接:https://www.cnblogs.com/buchizicai/p/15990777.html及本声明;
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。