主题:我是天尝地酒,请教一下moz和GGbond
天尝地酒
[专家分:870] 发布于 2007-08-09 10:37:00
请你们设计一个程序,让计算机找出40个自然数来,使得其中任意两个数之差均不相等。
[em1][em2][em18][em20][em15]
最后更新于:2007-08-09 10:47:00
回复列表 (共9个回复)
沙发
Matodied [专家分:7560] 发布于 2007-08-09 14:08:00
为什么不请教我??????
可能是你从来没见过我的缘故,我在参加今年市赛的人中是注册比较晚的一个。
废话少说。其实只要是2的整数次方就行了:1、2、4、8……不过2^39已经超过了长整型的范围,得用高精度。
程序:
DECLARE FUNCTION gjdadd$ (x$, y$)
CLS
a$ = "1"
FOR i = 1 TO 39
PRINT a$; " ";
IF i MOD 5 = 4 THEN PRINT
a$ = gjdadd$(a$, a$)
NEXT i
END
FUNCTION gjdadd$ (x$, y$)
lx = LEN(x$): ly = LEN(y$): IF lx < ly THEN l = ly ELSE l = lx
DIM a(l), b(l), s(l + 1)
FOR i = 1 TO lx: a(i) = VAL(MID$(x$, lx + 1 - i, 1)): NEXT i
FOR i = 1 TO ly: b(i) = VAL(MID$(y$, ly + 1 - i, 1)): NEXT i
FOR i = 1 TO l
s(i) = s(i) + a(i) + b(i)
IF s(i) >= 10 THEN s(i) = s(i) - 10: s(i + 1) = s(i + 1) + 1
NEXT i
IF s(l + 1) = 0 THEN lz = l ELSE lz = l + 1
FOR i = lz TO 1 STEP -1
z$ = z$ + RTRIM$(LTRIM$(STR$(s(i))))
NEXT i
gjdadd$ = z$
END FUNCTION
板凳
moz [专家分:37620] 发布于 2007-08-09 15:40:00
呵呵,这道题我也做过很多次,希望Mato再好好想想.我开始也是像你这么认为的.
3 楼
Matodied [专家分:7560] 发布于 2007-08-09 21:29:00
难道moz有更简便的方法或者更小的解吗?
4 楼
moz [专家分:37620] 发布于 2007-08-09 22:03:00
是的,你试40带头看看
5 楼
snoopy7 [专家分:70] 发布于 2007-08-10 09:42:00
CLS
DIM A(100)
A(1) = 1
PRINT 1;
S = 1
FOR I = 2 TO 39
X = 0
FOR J = 1 TO 100
X = A(J) * 2 + X
A(J) = X MOD 10
X = X \ 10
NEXT
K = 100
DO WHILE A(K) = 0: K = K - 1: LOOP
FOR J = K TO 1 STEP -1
PRINT USING "#"; A(J);
NEXT
PRINT " ";
S = S + 1
IF S = 5 THEN PRINT : S = 0
NEXT
6 楼
moz [专家分:37620] 发布于 2007-08-10 19:40:00
其实在这个问题上,很容易造成一个误解的,
惯性思维都是从1开始,然后两两之差不等,
也就是说39个差之间不能存在重复甚至和差关系.
例 1,2,4,7 差为 1,2,3 因为 1+2=3 引致 7 - 4 = 4 - 1
从1开始,使得结果将会变得很大.
2^0, 2^1, 2^2, 2^3 ,,,,,,,,,, 2^39 = 549755813888
我记得以前的讨论是从40开始的,但差怎么设置,我还没想起来,想起来再说.
7 楼
moz [专家分:37620] 发布于 2007-08-11 12:45:00
这是最直观的程序,我还是没想起来以前的差是多少.
DEFLNG A-Z
DIM s(10000), a(39)
INPUT ; a(0)
m = 1
DO
FOR i = m TO a(k) - a(0)
IF s(i) = 0 THEN EXIT FOR
NEXT
k = k + 1
a(k) = a(k - 1) + i
m = i + 1
PRINT a(k);
FOR i = 0 TO k
s(a(k) - a(i)) = 1
NEXT
LOOP UNTIL k = 39
8 楼
网虫一号 [专家分:1230] 发布于 2007-08-13 11:09:00
CLS
RANDOMIZE
a = INT(RND * 999 + 1): k = 0: x = a: GOSUB 100
b = INT(RND * 999 + 1): k = 0: x = b
PRINT TAB(33); "*"; : GOSUB 100
PRINT TAB(31); "------------"
y = b: k = 0: IF b < 10 THEN 20
10 q = y MOD 10: y = y \ 10: x = a * q
IF x > 0 THEN GOSUB 100
IF y > 0 THEN k = k + 1: GOTO 10
PRINT TAB(31); "------------"
20 x = a * b: k = 0: GOSUB 100
END
100 x$ = STR$(x): L = LEN(x$)
PRINT TAB(40 - L - k); x$
RETURN
9 楼
小精灵1号 [专家分:1040] 发布于 2007-08-13 11:12:00
CLS
RANDOMIZE
a = INT(RND * 999 + 1): k = 0: x = a: GOSUB 100
b = INT(RND * 999 + 1): k = 0: x = b
PRINT TAB(33); "*"; : GOSUB 100
PRINT TAB(31); "------------"
y = b: k = 0: IF b < 10 THEN 20
10 q = y MOD 10: y = y \ 10: x = a * q
IF x > 0 THEN GOSUB 100
IF y > 0 THEN k = k + 1: GOTO 10
PRINT TAB(31); "------------"
20 x = a * b: k = 0: GOSUB 100
END
100 x$ = STR$(x): L = LEN(x$)
PRINT TAB(40 - L - k); x$
RETURN
我来回复