主题:[原创]卡布列卡猜想验证程序三个源代码,请大家分别评价一下!谢谢。
天山雪莲
[专家分:0] 发布于 2007-08-19 05:11:00
[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]
最后更新于:2007-08-20 21:24:00
回复列表 (共18个回复)
沙发
wzc1996 [专家分:1680] 发布于 2007-08-19 08:57:00
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
板凳
snoopy7 [专家分:70] 发布于 2007-08-19 09:15:00
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 楼
天山雪莲 [专家分:0] 发布于 2007-08-19 12:01:00
下面是我编的《卡布列卡猜想验证程序》源代码:
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 楼
天山雪莲 [专家分:0] 发布于 2007-08-19 12:09:00
[color=000080][size=2]
上面是卡布列卡猜想验证程序三个源代码,
请专家们分别对上述代码的特点做一下自己的评价,
感谢! [/size][/color]
5 楼
强强 [专家分:4740] 发布于 2007-08-19 13:12:00
这三个源代码处处都闪烁着人类智慧的光芒,太美丽了,简洁、明快,只有各位达人才能写出这样的代码,看了这么完美的程序我控制不了我激动的心情,我要喊出我的心声!!!!楼上几位,你们太有才了!!!!!!!!!!!!
6 楼
Matodied [专家分:7560] 发布于 2007-08-19 13:33:00
楼上的别说奉承话了,还简洁、明快呢?你们的程序简直长的吓死人。
还是看我的最好。
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 楼
wzc1996 [专家分:1680] 发布于 2007-08-19 15:21:00
[quote]这三个源代码处处都闪烁着人类智慧的光芒,太美丽了,简洁、明快,只有各位达人才能写出这样的代码,看了这么完美的程序我控制不了我激动的心情,我要喊出我的心声!!!!楼上几位,你们太有才了!!!!!!!!!!!![/quote]
你要是看了6楼的,你会吐血的!!!
6楼的才是处处都闪烁着人类智慧的光芒,太美丽了,简洁、明快,只有达人才能写出这样的代码,看了这么完美的程序我控制不了我激动的心情,我要喊出我的心声!!!!
[em15][em15][em15][em15][em15][em14][em14][em14][em13]
8 楼
moz [专家分:37620] 发布于 2007-08-19 18:32:00
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 楼
强强 [专家分:4740] 发布于 2007-08-19 18:35:00
我会吐血??!!
哈哈哈哈
你们所热衷的东西对我来说一点兴趣也没有。
10 楼
冷石_jasv [专家分:1570] 发布于 2007-08-19 18:39:00
同上..
我和强强是同一种人.
我来回复