鸡兔同笼。小朋友数了数圈在笼子里的鸡和兔共有
14个头,脚共有
44只,问圈在笼子里的鸡和兔各有多少只?
如果将这个程序进一步扩展,在程序开头,要求用户输入笼子里的鸡、兔的头与脚的数量,则程序运用范围更广一些。原程序可以改为
ex13_6.prg:
算法分析。这个问题与上次所讲的盲人裁判的问题差不多,如何解决鸡兔同笼问题呢?首先,设笼子中有x只鸡,则兔有14-x(为什么?因为无论是鸡或兔都只有一个头噻)。其次,寻找到另一个条件,脚一共有44只;这里还要用上生活常识作为默认条件,即一只鸡有2只脚,一只兔有4只脚,所以不用考虑鸡、兔缺胳膊少腿这种残疾现象,也不用说是死鸡死兔肢体不全了(如果那样,就叫钻牛角尖了,不是一种正确正常的考虑问题的方法),所以得到2x+4(14-x)=44这个条件。
按照人类一般思维及解决问题的推理方法,直接求解这个方程就可以了,可以得到x=6。但根据计算机的特点又如何解决吗?我们说过,计算机喜欢在大量的重复劳动中找到答案,所以,运用穷举法原理,让整数x从0变到14,验证哪一个x满足条件2x+4(14-x)=44,如果满足条件,就输出,如果不满足条件,就继续判断。注意要将条件2x+4(14-x)=44改写成VFP表达式。源程序ex13_5.prg如下:
SET TALK OFF
CLEA
CLEA ALL
heads = 14
feets = 44
FOR x = 0 TO heads
IF 2 * x + 4 * ( heads - x) = feets
? " 笼里的鸡和兔共有 " + STR(heads)
?? " 个头,共有 " + STR(feets) + " 只脚。 "
? " 其中,鸡有 " + STR(x) + " 只 "
?? " , 兔有 " + STR(heads - x) + " 只 "
ENDIF
ENDFOR
RETU
CLEA
CLEA ALL
heads = 14
feets = 44
FOR x = 0 TO heads
IF 2 * x + 4 * ( heads - x) = feets
? " 笼里的鸡和兔共有 " + STR(heads)
?? " 个头,共有 " + STR(feets) + " 只脚。 "
? " 其中,鸡有 " + STR(x) + " 只 "
?? " , 兔有 " + STR(heads - x) + " 只 "
ENDIF
ENDFOR
RETU
SET TALK OFF
CLEA
CLEA ALL
INPUT " 笼子里鸡和兔的总头 数: " TO h
INPUT " 笼子里鸡和兔的总脚 数: " TO F
Y = (F - 2 * h) / 2
x = ( 4 * h - F) / 2
IF Y < 0 OR x < 0
? " 数据有错,不能作为鸡兔同笼问题! "
RETU
ENDIF
heads = h
feets = F
FOR x = 0 TO heads
IF 2 * x + 4 * ( heads - x) = feets
? " 笼里的鸡和兔共有 " ;
+ ALLT(STR(heads))
?? " 个头,共有 "
?? ALLT(STR(feets)) + " 只脚。 "
? " 其中,鸡有 " ;
+ ALLT(STR(x)) + " 只 "
?? " , 兔有 "
?? + ALLT(STR(heads - x)) + " 只 "
ENDIF
ENDFOR
RETU
CLEA
CLEA ALL
INPUT " 笼子里鸡和兔的总头 数: " TO h
INPUT " 笼子里鸡和兔的总脚 数: " TO F
Y = (F - 2 * h) / 2
x = ( 4 * h - F) / 2
IF Y < 0 OR x < 0
? " 数据有错,不能作为鸡兔同笼问题! "
RETU
ENDIF
heads = h
feets = F
FOR x = 0 TO heads
IF 2 * x + 4 * ( heads - x) = feets
? " 笼里的鸡和兔共有 " ;
+ ALLT(STR(heads))
?? " 个头,共有 "
?? ALLT(STR(feets)) + " 只脚。 "
? " 其中,鸡有 " ;
+ ALLT(STR(x)) + " 只 "
?? " , 兔有 "
?? + ALLT(STR(heads - x)) + " 只 "
ENDIF
ENDFOR
RETU
思考:① 这里只加了一段输入数据的程序,并进行数据验证。这个验证是必要的,否则无法构成鸡兔问题了。请分析一下,程序中是根据什么原理来验证数据的?
② ex13-5.prg与ex13_6.prg 两段程序在输出命令上有一些区别,试分析allt()函数的功能。
③ 除了ex13_6.prg中加有allt()函数外,两段程序的输出结果基本是相同的的,试比较两段程序中分别“;”和问号“??”的作用。