回 帖 发 新 帖 刷新版面

主题:[原创]卡布列卡猜想验证程序三个源代码,请大家分别评价一下!谢谢。

[color=000080]验证卡布列卡猜想 

  印度数学家卡布列卡在研究数学问题时发现一个有趣的现象:用不完全相同的四个数字组成一个四位数,将组成这个四位数的四个数字重新排序,组成一个最大的数和一个最小的数,并用较大的数减去较小的数,对减得的差再重复上述操作,差如果不够四位数时,用零补位。不断地做下去,最后变成了一个固定不变的数:6174。卡布列卡普做过大量的试验,结果不论从任何满足条件的四位数开始,最后总能变成6174。因此,卡布列卡风趣地把6174叫做卡布列卡常数。

  例如,我们从4231开始,首先把4231重新排列成4321和1234,两数相减得3087;再把3087重新排列成8730和0378,两数相减得8382;再把8352重新排列成8532和2358,相减得6174;再把6174重新排列成7641和1467,两数相减仍然得6174。

  4231:4321-1234=3087

  3087:8730-0378=8352;

  8352:8532-2358=6174;

  6174:7941-1467=6174。

  请你设计一个程序,验证卡布列卡猜想。并把验证猜想的每一步结果打印出来。[/color]

回复列表 (共18个回复)

沙发

DECLARE SUB shuzi (n AS INTEGER)
DECLARE SUB sort1 (a() AS INTEGER, k AS INTEGER)
DECLARE SUB sort2 (a() AS INTEGER, k AS INTEGER)
CLS
DEFINT I, N
CONST k = 4
INPUT n
DIM SHARED a(1 TO k) AS INTEGER
DO
CALL shuzi(n)
CALL sort1(a(), k)
s1 = 0: s2 = 0
FOR i = 1 TO k: s1 = s1 + a(i) * (10 ^ (4 - i)): NEXT
CALL sort2(a(), k)
FOR i = 1 TO k: s2 = s2 + a(i) * (10 ^ (4 - i)): NEXT
n = s1 - s2: PRINT s1; "-"; s2; "="; s1 - s2
LOOP UNTIL n = 6174
END
SUB shuzi (n AS INTEGER)
FOR j = 1 TO k: nn = INT(n / 10): a(j) = n - nn * 10: n = nn: NEXT
END SUB
SUB sort1 (a() AS INTEGER, k AS INTEGER)
FOR i = 1 TO k - 1: FOR j = i TO k: IF a(i) < a(j) THEN SWAP a(i), a(j)
NEXT
NEXT
END SUB
SUB sort2 (a() AS INTEGER, k AS INTEGER)
FOR i = 1 TO k - 1: FOR j = i TO k: IF a(i) > a(j) THEN SWAP a(i), a(j)
NEXT
NEXT
END SUB

板凳


CLS
INPUT n
DO WHILE n <> 6174
i = 0
DO WHILE n <> 0
i = i + 1
a(i) = n MOD 10
n = n \ 10
LOOP
FOR i = 1 TO 4
FOR y = i + 1 TO 4
IF a(i) < a(y) THEN SWAP a(i), a(y)
NEXT
NEXT
q = 0: w = 0
FOR i = 1 TO 4
q = q * 10 + a(i)
w = w * 10 + a(5 - i)
NEXT
PRINT q; "-"; w; "="; q - w
n = q - w
LOOP

3 楼


下面是我编的《卡布列卡猜想验证程序》源代码:

DECLARE FUNCTION MPD (T1, T2, T3, T4)
DECLARE FUNCTION MPX (T1, T2, T3, T4)

DIM NUMB AS STRING
DIM NUM AS LONG

SCREEN 12
CLS

YX = 1
NUM = 1

BEG:

COLOR 15

WHILE NUM < 1000 OR NUM > 9999
      INPUT "77=>EXIT_PROG:PLEASE INPUT YOUR INTEGER:", NUM
      IF NUM = 77 THEN END
WEND

NUMB = STR$(NUM)

T1 = VAL(MID$(NUMB$, 2, 1))
T2 = VAL(MID$(NUMB$, 3, 1))
T3 = VAL(MID$(NUMB$, 4, 1))
T4 = VAL(MID$(NUMB$, 5, 1))

MPD1 = MPD(T1, T2, T3, T4)
MPX1 = MPX(T1, T2, T3, T4)
MPC = MPD1 - MPX1

COLOR 14
IF NUM = 6174 THEN COLOR 13

PRINT NUMB; ":"; MPD1; "-"; MPX1; "="; MPC;

COLOR 4: PRINT YX

YX = YX + 1

IF NUM = 6174 AND MPC = 6174 THEN NUM = 1: YX = 1: GOTO BEG

NUM = MPC

IF MPC < 1000 THEN NUM = MPC * 10

GOTO BEG

FUNCTION MPD (T1, T2, T3, T4)

AA = T1
BB = T2
CC = T3
DD = T4

IF DD > CC THEN TEMP = DD: DD = CC: CC = TEMP
IF CC > BB THEN TEMP = CC: CC = BB: BB = TEMP
IF BB > AA THEN TEMP = BB: BB = AA: AA = TEMP
IF DD > CC THEN TEMP = DD: DD = CC: CC = TEMP
IF CC > BB THEN TEMP = CC: CC = BB: BB = TEMP
IF BB > AA THEN TEMP = BB: BB = AA: AA = TEMP
IF DD > CC THEN TEMP = DD: DD = CC: CC = TEMP
IF CC > BB THEN TEMP = CC: CC = BB: BB = TEMP
IF BB > AA THEN TEMP = BB: BB = AA: AA = TEMP

MPD = VAL(STR$(AA) + STR$(BB) + STR$(CC) + STR$(DD))

END FUNCTION

FUNCTION MPX (T1, T2, T3, T4)

AA = T1
BB = T2
CC = T3
DD = T4

IF DD > CC THEN TEMP = DD: DD = CC: CC = TEMP
IF CC > BB THEN TEMP = CC: CC = BB: BB = TEMP
IF BB > AA THEN TEMP = BB: BB = AA: AA = TEMP
IF DD > CC THEN TEMP = DD: DD = CC: CC = TEMP
IF CC > BB THEN TEMP = CC: CC = BB: BB = TEMP
IF BB > AA THEN TEMP = BB: BB = AA: AA = TEMP
IF DD > CC THEN TEMP = DD: DD = CC: CC = TEMP
IF CC > BB THEN TEMP = CC: CC = BB: BB = TEMP
IF BB > AA THEN TEMP = BB: BB = AA: AA = TEMP

MPX = VAL(STR$(DD) + STR$(CC) + STR$(BB) + STR$(AA))

END FUNCTION

4 楼

[color=000080][size=2]
上面是卡布列卡猜想验证程序三个源代码,

请专家们分别对上述代码的特点做一下自己的评价,

感谢! [/size][/color]

5 楼

这三个源代码处处都闪烁着人类智慧的光芒,太美丽了,简洁、明快,只有各位达人才能写出这样的代码,看了这么完美的程序我控制不了我激动的心情,我要喊出我的心声!!!!楼上几位,你们太有才了!!!!!!!!!!!!

6 楼

楼上的别说奉承话了,还简洁、明快呢?你们的程序简直长的吓死人。
还是看我的最好。
CLS
INPUT n$
DIM a$(4)
1 FOR i = 1 TO 4: a$(i) = MID$(n$, i, 1): NEXT i
FOR i = 1 TO 3: FOR j = i + 1 TO 4
    IF a$(i) < a$(j) THEN SWAP a$(i), a$(j)
NEXT j, i
a1 = VAL(a$(1) + a$(2) + a$(3) + a$(4))
a2 = VAL(a$(4) + a$(3) + a$(2) + a$(1))
PRINT a1; "-"; a2; "="; a1 - a2
IF a1 - a2 = 6174 THEN END
n$ = LTRIM$(STR$(a1 - a2)): GOTO 1
END

7 楼

[quote]这三个源代码处处都闪烁着人类智慧的光芒,太美丽了,简洁、明快,只有各位达人才能写出这样的代码,看了这么完美的程序我控制不了我激动的心情,我要喊出我的心声!!!!楼上几位,你们太有才了!!!!!!!!!!!![/quote]
你要是看了6楼的,你会吐血的!!!



6楼的才是处处都闪烁着人类智慧的光芒,太美丽了,简洁、明快,只有达人才能写出这样的代码,看了这么完美的程序我控制不了我激动的心情,我要喊出我的心声!!!!

[em15][em15][em15][em15][em15][em14][em14][em14][em13]

8 楼

1. 如果作为算法问题,界面就不再有必要了,各人有各人的喜好.在这里就显得累赘了.
2. 六楼虽显稚气自大,不过基本做法还算过得去,最好别用那么多的冒号
   另外goto也可以用do来代替.
3. 既然是验证,一个数一个数来做很有意思吗? 
   为什么不做一个循环从123 to 6789来验证呢?
4. 我从数学角度来分析一下,不过只有前半截,后半截我想不下去了,
   提供一个方向给大家看有没有帮助.

A. 四个不同的数字 0-9 
   (其实中间过程也会出现相同数字的,只是条件避开了6666-6666)
B. 差的式子可以表示为:
   倒序-顺序=差   

   代数式中D为最大数字A为最小数字,可得
差=DCBA-ABCD                                 (分解式子)
  =D*1000-D+C*100-C*10+B*10-B*100+A-A*1000   (合并同类项)
  =(D-A)*999+(C-B)*90
根据四个不同数字的条件可得: 
(D-A)的值域是[3,9]   (D-A)*999 的结果只有如下几个数:
2997,3996,4995,5994,6993,7992,8991    (尾数只能是1-7)        代号:X
夹在中间的两个数之差肯定要比(D-A)少2,得:
(C-B)的值域是[1,7]   (C-B)*90 的结果也只有如下几个数:
  90, 180, 270, 360, 450, 540, 630                           代号:Y
还要注意一下搭配关系,因为外差比内差要大,所以
8991可以和任何一个Y相加,
而2997却只能和90相加.而不能与其他Y相加.

相加的结果会怎样呢?
尾数1-7不会改变
X项后面两个9,与Y中的一个1相加即可,
结果X的最高位+1,而Y就要-1

根据这样的计算过程,差的最高位 = ( D-A )
                   差的最低位 = 10 - 最高位 = 10 - ( D-A )
                   差的第二位 = 内差-1 = C-B-1
                   差的第三位 = 8 - 第二位数值

用字母代数(QB语法):
D=D-A
A=10-D
C=C-B-1
B=8-C

至于为什么只有1467循环而其他数字不循环呢?多验证多验证.

9 楼

我会吐血??!!
哈哈哈哈
你们所热衷的东西对我来说一点兴趣也没有。

10 楼

同上..
我和强强是同一种人.

我来回复

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