回 帖 发 新 帖 刷新版面

主题:我是天尝地酒,请教一下moz和GGbond

请你们设计一个程序,让计算机找出40个自然数来,使得其中任意两个数之差均不相等。

[em1][em2][em18][em20][em15]

回复列表 (共9个回复)

沙发

为什么不请教我??????

可能是你从来没见过我的缘故,我在参加今年市赛的人中是注册比较晚的一个。

废话少说。其实只要是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

板凳

呵呵,这道题我也做过很多次,希望Mato再好好想想.我开始也是像你这么认为的.

3 楼

难道moz有更简便的方法或者更小的解吗?

4 楼

是的,你试40带头看看

5 楼


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 楼

其实在这个问题上,很容易造成一个误解的,
惯性思维都是从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 楼

这是最直观的程序,我还是没想起来以前的差是多少.

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 楼

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 楼

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

我来回复

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