主题:[原创]卡布列卡猜想验证程序三个源代码,请大家分别评价一下!谢谢。
天山雪莲
[专家分: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个回复)
11 楼
moz [专家分:37620] 发布于 2007-08-19 19:13:00
我与9,10楼不是同道中人,志不同,道不合,不相为谋,我吐血了.
12 楼
天山雪莲 [专家分:0] 发布于 2007-08-19 20:19:00
moz请你评价一下3楼的代码,看你能说出什么东西来啊!
13 楼
Matodied [专家分:7560] 发布于 2007-08-19 20:39:00
其实我的算法是比较短的,最重要的一点是,我的算法是可以让人看懂的。
程序中,在保证正确性的情况下,程序的长短并不重要,重要的是易读性。
(还有,5、7楼那种说奉承话的习惯并不好。)
如果你们有比我更好的程序,请发上来。
14 楼
moz [专家分:37620] 发布于 2007-08-19 23:40:00
非要我吭两声的话,我就哆哩几句吧.
1. 用0模式速度快,切换方便,没有必要用12模式
2. 排序的那一段比较冗余,QB有swap可用,虽说争议挺多,但的确方便
3. 四个数,你用了九次比较,其实不用,基本上六次冒泡比较就可以了.
4. 我一般编程尽量避免使用行标号的.而且do比while会更灵活可靠.
5. Mato的观点或者说立场不好,过于自持.
虽说字符串原是我所好,在QB里的灵活方便的确是其他语言所不能比美的.
但要明白,字符与数值的转换,相对于数值四则运算,并非所长.
特别是海量处理.所以这个问题上我更倾向2楼的方向.
6. 并不是说二次赋值会造成什么后果或拖累,
不过我的确是觉得按值传递,比多赋一次变量值,更方便,更明确,
最重要的是更好看些,呵呵.
7. 我也自大,我也哆嗦.所以我敢厚脸皮的向天上吹,不过,我倒是觉得,我有这资格,不是吗?
15 楼
强强 [专家分:4740] 发布于 2007-08-19 23:42:00
没有比你好的程序了,你的编程水平在国内也应该是首曲一指的了,不敢和你过招,你大人有大量,不要和我们一般见识。
16 楼
天山雪莲 [专家分:0] 发布于 2007-08-20 08:35:00
把程序改了一下,去掉了函数,请评价!~
DIM NUMB AS STRING
DIM NUM AS LONG
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))
IF T4 > T3 THEN SWAP T4, T3
IF T3 > T2 THEN SWAP T3, T2
IF T2 > T1 THEN SWAP T2, T1
IF T4 > T3 THEN SWAP T4, T3
IF T3 > T2 THEN SWAP T3, T2
IF T2 > T1 THEN SWAP T2, T1
IF T4 > T3 THEN SWAP T4, T3
MPD = VAL(STR$(T1) + STR$(T2) + STR$(T3) + STR$(T4))
MPX = VAL(STR$(T4) + STR$(T3) + STR$(T2) + STR$(T1))
MPC = MPD - MPX
COLOR 14: IF NUM = 6174 THEN COLOR 13
PRINT NUMB; ":"; MPD; "-"; MPX; "="; MPC;
COLOR 4: PRINT YX: YX = YX + 1
IF NUM - MPC = 0 THEN NUM = 1: YX = 1: GOTO BEG
NUM = MPC: IF MPC < 1000 THEN NUM = MPC * 10
GOTO BEG
17 楼
moz [专家分:37620] 发布于 2007-08-20 10:49:00
严正声明:15楼发言是针对13楼而言,并非评论14楼,特此声明.
TO:天山
不知道这样改有没有意见?
其实如果可以的话,还是数值计算比字符串转换来得安全快捷,
当然,效果无相差.
DEFINT A-Z
DIM NUMB AS STRING
CLS
DO
YX = 1
COLOR 15
DO
INPUT "PLEASE INPUT YOUR INTEGER:", Num
IF Num < 1 THEN END
LOOP WHILE Num < 1000 OR Num > 9999
DO
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))
IF T4 > T3 THEN SWAP T4, T3
IF T4 > T2 THEN SWAP T4, T2
IF T4 > T1 THEN SWAP T4, T1
IF T3 > T2 THEN SWAP T3, T2
IF T3 > T1 THEN SWAP T3, T1
IF T2 > T1 THEN SWAP T2, T1
MPD = VAL(STR$(T1) + STR$(T2) + STR$(T3) + STR$(T4))
MPX = VAL(STR$(T4) + STR$(T3) + STR$(T2) + STR$(T1))
MPC = MPD - MPX
IF Num = 6174 THEN COLOR 13 ELSE COLOR 14
PRINT NUMB; ":"; MPD; "-"; MPX; "="; MPC;
COLOR 4: PRINT YX: YX = YX + 1
SWAP Num, MPC
LOOP UNTIL Num = MPC
LOOP
18 楼
9611 [专家分:30] 发布于 2007-08-21 11:57:00
CLS
INPUT N
S2 = N
10 A = S2 MOD 10
B = (S2 MOD 100) \ 10
C = (S2 MOD 1000) \ 100
D = S2 \ 1000
IF A < B THEN SWAP A, B
IF A < C THEN SWAP A, C
IF A < D THEN SWAP A, D
IF B < C THEN SWAP B, C
IF B < D THEN SWAP B, D
IF C < D THEN SWAP C, D
S = A * 1000 + B * 100 + C * 10 + D
S1 = D * 1000 + C * 100 + B * 10 + A
S2 = S - S1
IF S2 = 6174 THEN PRINT S; "-"; S1; "="; S2: END ELSE PRINT S; "-"; S1; "="; S2
GOTO 10
END
我来回复