主题:我是菜鸟,请大家回答
dznick
[专家分:60] 发布于 2005-08-26 08:56:00
一根29cm长的尺子,只允许在上面刻度要能用它量出1~29cm的各种长度。试问这根尺的刻度应该怎么选择?
回复列表 (共9个回复)
沙发
moz [专家分:37620] 发布于 2005-08-26 10:47:00
怎么量?
只刻 1 CM 的刻度,
可以量出精度为 1 cm 的任何长度
问题只是需要量多少次而已
板凳
lwm1988 [专家分:90] 发布于 2005-08-26 10:52:00
qqqq
3 楼
dznick [专家分:60] 发布于 2005-08-27 08:33:00
就是一次能量1到n为至,
4 楼
moz [专家分:37620] 发布于 2005-08-27 09:23:00
头尾0和29应该不算的吧
按照一般的做法
做七个循环套
第一个变量i1从 1 到 (29-6)=23
第二个变量i2从 i1+1 到 (29-5)=24
第三个变量i3从 i2+1 到 (29-4)=25
........
next
在循环套里面检查一次所有刻度是否符合要求
两两相减,检查所有的差是否已覆盖从1-29之间的所有值
如果不符合,跳出再next
符合,输出结果
5 楼
dznick [专家分:60] 发布于 2005-08-27 09:32:00
我不懂啊,你把程序写出来好吗?
6 楼
moz [专家分:37620] 发布于 2005-08-27 14:08:00
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 楼
dznick [专家分:60] 发布于 2005-08-27 19:45:00
谢谢你哦,可不可以解释一下啊,看不懂!
真的有点难度啊!!
8 楼
moz [专家分:37620] 发布于 2005-08-27 21:17:00
解释?
之前已经解释过了啊.
不同的只是我没有做够七个循环套,而用了动态多层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 楼
spray [专家分:180] 发布于 2005-09-01 06:18:00
建议:请在标题中具体、明确点明主题,最好不用“小菜问题”、“跪求”之类的模糊标题。
我来回复