百鸡有关问题代码优化
百鸡问题代码优化
百钱百鸡问题。
公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡
问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问
鸡翁、母、雏各几何?
分析:这是一个有名的不定方程问题。
设鸡翁数为x,鸡母数为y,鸡雏数为z,则可列方程如下:
x+y+z=100
5x+3y+z/3=100⎪⎨
对于上述不定方程问题,要先确定一个变量的值,才能对它求解。
由问题给出的条件,很容易得到三个变量的取值范围。
x:0~19中的整数(因为每只鸡翁5钱,因此它不可能超过19
只);
y:0~33中的整数(因为每只鸡母3钱,因此它不可能超过33
只);
z:0~100中的整数(因为共买百鸡,因此它不可能超过100只)
解决该问题可以采用穷举法。穷举法是一种重复性算法。它的基本思想是
对所有可能解一一测试,直到找到解或将全部可能解都测试为止。对三个未知
量,依次取x为值域中的一个值,然后求其余两个未知量,满足方程组则为该题
的解。
新建一个工程,在窗体中添加一个按钮组件,在按钮的单击事件中加入
如下代码。
var x,y,z:integer;
p:string;
begin
for x:=0 to 19 do
for y:=0 to 33 do
begin
z:=100-x-y;
if 5*x+3*y+z/3=100 then
begin
p:=format('得到一个解:鸡翁%d只,鸡母%d只,鸡雏%d只',[x,y,z]);
------解决方案--------------------
这效率已经可以了,你要过滤一些,其实也要做判断的,对效率没多大影响吧
------解决方案--------------------
------解决方案--------------------
这个我在高中时也做过
x+y+z=100---------1
5x+3y+z/3=100-----2
把1代入2,消去z,得
y=(100-7x)/4
z=100-x-y
穷举x就可以了,因为x最少
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,z:integer;
p:string;
begin
for x := 0 to 19 do
if ((100-7*x) mod 4 = 0) and ((100-7*x) div 4 >= 0) then
begin
y := (100-7*x) div 4;
z := 100 - x - y;
p:=p+format('得到一个解:鸡翁%d只,鸡母%d只,鸡雏%d只'#13#10,[x,y,z]);
end;
showmessage(p);
end;
百钱百鸡问题。
公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡
问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问
鸡翁、母、雏各几何?
分析:这是一个有名的不定方程问题。
设鸡翁数为x,鸡母数为y,鸡雏数为z,则可列方程如下:
x+y+z=100
5x+3y+z/3=100⎪⎨
对于上述不定方程问题,要先确定一个变量的值,才能对它求解。
由问题给出的条件,很容易得到三个变量的取值范围。
x:0~19中的整数(因为每只鸡翁5钱,因此它不可能超过19
只);
y:0~33中的整数(因为每只鸡母3钱,因此它不可能超过33
只);
z:0~100中的整数(因为共买百鸡,因此它不可能超过100只)
解决该问题可以采用穷举法。穷举法是一种重复性算法。它的基本思想是
对所有可能解一一测试,直到找到解或将全部可能解都测试为止。对三个未知
量,依次取x为值域中的一个值,然后求其余两个未知量,满足方程组则为该题
的解。
新建一个工程,在窗体中添加一个按钮组件,在按钮的单击事件中加入
如下代码。
var x,y,z:integer;
p:string;
begin
for x:=0 to 19 do
for y:=0 to 33 do
begin
z:=100-x-y;
if 5*x+3*y+z/3=100 then
begin
p:=format('得到一个解:鸡翁%d只,鸡母%d只,鸡雏%d只',[x,y,z]);
------解决方案--------------------
这效率已经可以了,你要过滤一些,其实也要做判断的,对效率没多大影响吧
------解决方案--------------------
------解决方案--------------------
这个我在高中时也做过
x+y+z=100---------1
5x+3y+z/3=100-----2
把1代入2,消去z,得
y=(100-7x)/4
z=100-x-y
穷举x就可以了,因为x最少
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,z:integer;
p:string;
begin
for x := 0 to 19 do
if ((100-7*x) mod 4 = 0) and ((100-7*x) div 4 >= 0) then
begin
y := (100-7*x) div 4;
z := 100 - x - y;
p:=p+format('得到一个解:鸡翁%d只,鸡母%d只,鸡雏%d只'#13#10,[x,y,z]);
end;
showmessage(p);
end;