回 帖 发 新 帖 刷新版面

主题:我是菜鸟,请大家回答

一根29cm长的尺子,只允许在上面刻度要能用它量出1~29cm的各种长度。试问这根尺的刻度应该怎么选择?

回复列表 (共9个回复)

沙发

怎么量?
只刻 1 CM 的刻度,
可以量出精度为 1 cm 的任何长度
问题只是需要量多少次而已

板凳

qqqq

3 楼

就是一次能量1到n为至,

4 楼

头尾0和29应该不算的吧

按照一般的做法

做七个循环套
第一个变量i1从 1 到 (29-6)=23
第二个变量i2从 i1+1 到 (29-5)=24
第三个变量i3从 i2+1 到 (29-4)=25
........
next

在循环套里面检查一次所有刻度是否符合要求
    两两相减,检查所有的差是否已覆盖从1-29之间的所有值
    如果不符合,跳出再next
    符合,输出结果

5 楼

我不懂啊,你把程序写出来好吗?

6 楼

DECLARE FUNCTION checksub (a, t())

d = 8
DIM s(d)
CLS
s(0) = 0
s(d) = 29

DO UNTIL s(0)

   if checksub(j + 1, s())<>0 then
        PRINT "OK -";
        FOR i = 0 TO j + 1
            PRINT s(i);
        NEXT
        PRINT
   END IF

   IF j < d - 1 THEN
        j = j + 1
        s(j) = s(j - 1)
   END IF

   DO
        IF s(j) >= s(d) THEN j = j - 1
        s(j) = s(j) + 1
   LOOP UNTIL s(j) < s(d)

   s(j + 1) = s(d)
LOOP
SYSTEM

FUNCTION checksub (a, t())
    DIM p(29)
    FOR i = a TO 1 STEP -1
        FOR j = i - 1 TO 0 STEP -1
            k = t(i) - t(j)
            p(k) = p(k) + 1
        NEXT
    NEXT
    FOR l = 1 TO 29
        IF p(l) = 0 THEN EXIT FOR
    NEXT
    IF l > 29 THEN checksub = -1
END FUNCTION

总共算得有六种办法,可惜速度有点慢
0,1,2,14,18,21,24,27,29
0,1,3,6,13,20,24,28,29
0,1,4,10,16,22,24,27,29
0,1,5,9,16,23,26,28,29
0,2,5,7,13,19,25,28,29
0,2,5,8,11,15,27,28,29
不知道符合要求不?

7 楼

谢谢你哦,可不可以解释一下啊,看不懂!


真的有点难度啊!!

8 楼

解释?
之前已经解释过了啊.

不同的只是我没有做够七个循环套,而用了动态多层DO循环而已

CheckSub 的目的是检查那七个数值是否符合要求
         (两两相减的差是否把1-29全包含进来了)

这样子吧,我简单的说一下,你自己多思考喽
其实在QB的实际应用中,数组单元不可以作为for的自变量的
我在这里只是为了举例,不要生搬硬套.
s(0)=0
s(8)=29
for s(1)=1 to 22
  for s(2)=(s(1)+1) to 23
    for s(3)=(s(2)+1) to 24
      for s(4)=(s(3)+1) to 25
        for s(5)=(s(4)+1) to 26
          for s(6)=(s(5)+1) to 27
            for s(7)=(s(6)+1) to 28
              用 CheckSub 检查两两相减的差是否包括从1-29的所有数值
next .......

9 楼

建议:请在标题中具体、明确点明主题,最好不用“小菜问题”、“跪求”之类的模糊标题。

我来回复

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