回 帖 发 新 帖 刷新版面

主题:求教:有没有更好的算法?

有一群鸡和一群兔,它们的只数相同,它们的脚数都是三位数,且这两个三位数的数字分别是0,1,2,3,4,5。问鸡和兔的只数各是多少? 它们的脚数各是多少?

我的程序如下:

CLS
FOR I=50 TO 200            {I是只数的变量,采用穷举

法}
 JI=2*I                  {JI是鸡的脚数}
  TU=4*I                  {TU是兔的脚数}
  JIBAI=INT(JI/100)            {JIBAI是鸡的脚数的百位上

的数值}
  JISHI=INT((JI-JIBAI*100)/10)       {JISHI是鸡的脚数的十位上

的数值}
  JIGE=JI-JIBAI*100-JISHI*10        {JIGE是鸡的脚数的个位上

的数值}
  TUBAI=INT(TU/100)            {同上三句}
  TUSHI=INT((TU-TUBAI*100)/10)             {同上三句}
  TUGE=TU-TUBAI*100-TUSHI*10               {同上三句}
  IF JIBAI<>JISHI AND JISHI<>JIGE AND JIBAI<>TUBAI AND JISHI<>TUSHI
AND TUSHI<>TUGE AND TUBAI<>TUSHI AND JIBAI<6 AND JISHI<6 AND JIGE<6
AND TUBAI<6 AND TUSHI<6 AND TUGE<6
THEN PRINT "只数=";i:"鸡的脚数=";2*i:"兔的脚数=";4*i
{让鸡的脚数与免的脚数各个位置上的数不相等且不大于6,只能是

0,1,2,3,4,5}
NEXT I
END

感觉条件语句太长太复杂,有没有更好更简便的算法呢?请各位不吝赐教!

回复列表 (共5个回复)

沙发

I    是只数
2*I  是鸡脚数(三位数)
4*I  是兔脚数(三位数)

这两个三位数由六个数字组成 0,1,2,3,4,5
其中一个三位数是另一个三位数的两倍
430=215*2
304=152*2

这道题最主要的地方就是
6个数字0,1,2,3,4,5,6
如何组成两个三位数,其中一个数是另一个数的两倍
用排列的方法去解题

板凳

MOZ专家,可不可以直接给出答案啊?

3 楼

答案?

76只

4 楼

defint a-z
m$="012345"
l = LEN(m$)
kk=l
DIM i(kk), s(l)

k = 1
DO UNTIL i(0) > 0
   i(k) = i(k) + 1
   IF i(k) > l THEN
      i(k) = 0
      k = k - 1
      s(i(k)) = 0
   ELSEIF s(i(k)) = 0 THEN
      s(i(k)) = 1
      k = k + 1
      IF k > kk THEN
         k = k - 1
         a$=""
         FOR j = 1 TO k
          a$=a$+ MID$(m$, i(j), 1)
         NEXT
         gosub 10
      END IF
      s(i(k)) = 0
   END IF
LOOP

10
  JiLeg=val(left$(a$,3))
  TuLeg=val(right$(a$,3))
  if TuLeg=JiLeg*2 and (JiLeg mod 2 =0)and (TuLeg mod 4=0)and ((JiLeg/2)=(TuLeg/4)) then
     print "鸡有";JiLeg/2;"个,  共有";JiLeg;"只鸡脚"
     print "兔有";TuLeg/2;"个,  共有";TuLeg;"只兔脚"
     print
  endif
return

     

5 楼

对于单个字符全选排列,我还有更方便的办法:

a$ = "012345"
l = LEN(a$)
DO
  JiLeg=val(left$(a$,3))
  TuLeg=val(right$(a$,3))
  if TuLeg=JiLeg*2 and (JiLeg mod 2 =0)and (TuLeg mod 4=0)and ((JiLeg/2)=(TuLeg/4)) then
     print "鸡有";JiLeg/2;"个,  共有";JiLeg;"只鸡脚"
     print "兔有";TuLeg/2;"个,  共有";TuLeg;"只兔脚"
     print
  endif
  GOSUB 10
LOOP
END




10
e = l - 1
DO WHILE MID$(a$, e, 1) > MID$(a$, e + 1, 1)
   e = e - 1
   IF e < 1 THEN END
LOOP

FOR i = l TO (e + 1) STEP -1
    IF MID$(a$, i, 1) > MID$(a$, e, 1) THEN EXIT FOR
NEXT
b$ = MID$(a$, i, 1)
MID$(a$, i, 1) = MID$(a$, e, 1)
MID$(a$, e, 1) = b$

FOR i = (e + 1) TO (l + e + 1) \ 2
    j = l + e + 1 - i
    b$ = MID$(a$, i, 1)
    MID$(a$, i, 1) = MID$(a$, j, 1)
    MID$(a$, j, 1) = b$
NEXT
RETURN

如果需要注重速度的话,还可以把一些变量的比较运算再优化一点的

我来回复

您尚未登录,请登录后再回复。点此登录或注册