来源:互联网 作者:佚名 更新时间:2005-12-07 17:48:22
例2 用计算机验证角谷猜想。
日本数学家角谷曾提出一个有趣的猜想:从任何一个自然数n出发,如果是偶数,就除以2,如果是奇数,就乘以3再加1,不断重复这个操作,总能得到1。例如,当N=20的时候,有:
20→10→5→16→8→4→2→1。
现在,请你编一个程序,验证角谷猜想。
REM——验证角谷猜想——
INPUT “N=”;N
PRINT N; “—>”;
40 IF N=1 THEN PRINT 1: END
IF N/2=INT(N/2) THEN N=N/2 ELSE
N=3*N+1
IF N>1 THEN PRINT N;”-->”;:GOTO 40
RUN
N=30
30->15->46->23->70->35->106->53->160->
80->40->20->10->5->16->8->4->2->1
例3:验证“回文数猜想”。
左右对称的自然数称为回文数,例如,121,4224,13731等。有一个非常有趣的数学猜想与回文数有关,这就是“回文数猜想”:从任意一个两位或两位以上的自然数开始,将这个数与它的逆序数(如1992的逆序数是2991)相加,得到一个新数,再用这个新数与它的逆序数相加,不断重复上述操作,经过若干步的逆序相加之后,总可以得到一个回文数。例如,从1992开始,经过7步就得到了回文数。
(1) 1992+2991=4983
(2) 4983+3894=8877
(3) 8877+7788=16665
(4) 16665+56661=73326
(5) 73326+62337=135663
(6) 135663+366531=502194
(7) 502194+491205=993399
利用上述方法似乎永远也变不成回文数的最小数目是196。
(1) 196+691=887
(2) 887+788=1675
(3) 1675+5761=7436
(4) 7436+8347=13783
(5) 13783+38731=52514
…………………………
据报道,有人已经对196进行了50000步的逆序相加,仍然未出现回文数,这个数学猜想到目前为止还没有得到证实。现在请你设计一个程序,由计算机在局部范围内验证“回文数猜想”。并将寻找回文数的每一个步骤都显示在屏幕上。
问题分析
这是一个运用高精度加法的典型例题,在寻找回文数的过程中,要不断地进行两个自然数的累加。当累加的数字超过16位时,计算机便不能精确地显示了。因此也就无法再继续验证下去了。为了克服这一缺点,我们可以采用字符串输入的方式,并同时开辟两个数组,将每个数的每一位数字分别存放在两个不同的数组A(I)和B(I)中,A数组中的数与B数组中的数的顺序刚好相反,运算时对位相加即可。当然还要考虑进位问题,相加之后的结果仍然放回到A数组中。
首先,设两个数之和的长度为L,在判断两数之和颜悦色是否为回文数时,只须从I=1开始,到L/2+1为止,将A(I)单元中的数字与A(L-I+1)单元中的数字逐项进行比较,如果每一项都相等,则回文数已经找到了。
因为计算机只能在局部范围内验证这一猜想,所以我们应当确定一个累加次数,当达到这一次数仍未出现回文数时,我们就认为是找到了一个留待进一步考察的特征例。
程序清单
REM——验证回文数猜想——
20 INPUT“n=”;N $
LET L=LEN(N $):IF L<2THEN GOTO 20
DIM A(1000),B(1000)
GOSUB 200
60 GOSUB 300
IF P=1 THEN PRINT “OK! OK=”;END
LET T=0:Z=Z+1:PRINT”(“;Z”)”;
PRINT “ ”;:GOSUB 400:GOSUB 500
LET T=1:GOSUB 400:GOTO 60
200 REM——分离数字子程序——
FOR I=1 TO L
LET A(I)=VAL(MID $(N $,I,1)
LET B(I)=A(I)
NEXT I
RETURN
300 REM——判断是否为回文数子程序——
FOR I=1 TO INT(L/2)+1
IF A(I)<>A(L-I+1)THEN P=0;GOTO 340
NEXT I:P=1
340 RETURN
400 REM ——打印子程序——
FOR I=L TO 1 STEP –1:PRINT B(I);:
NEX T 1
IF T=1 THEN PRINT:RETURN
PRINT“+”;
FOR I=1 TO L:PRINT A(I);:NEXT 1
PRINT“=”;RETURN
500 REM——逆序相加子程序——
LET D=0
FOR I=1 TO L
LET B(I)=B(I)+A(L-I+1)+D
LET D=INT(B(I)/10)
LET B(I)=B(I)-10*D
NEXT I
IF D=1 THEN L=L+1:B(L)=1
FOR I=1TO L:A(I)=B(I):NEXT I
RETURN
运行结果举例
RUN
n=? 1999
(1)9991+1999=11990
(2)11990+09911=21901
(3)21901+10912=32813
(4)32813+31823=64636
(5)64636+63646=128282
(6)128282+282821=411103
(7)411103+301114=712217
OK! OK!
通过上面的举例,相信读者对用计算机验证数学猜想已经有了一些认识。下面,作为练
习,我们再给出一个数学猜想,请读者自己编制程序来验证该猜想的正确性。
验证卡布列卡猜想
印度数学家卡布列卡在研究数学问题时发现一个有趣的现象:用不完全相同的四个数字组成一个四位数,将组成这个四位数的四个数字重新排序,组成一个最大的数和一个最小的数,并用较大的数减去较小的数,对减得的差再重复上述操作,差如果不够四位数时,用零补位。不断地做下去,最后变成了一个固定不变的数:6174。卡布列卡普做过大量的试验,结果不论从任何满足条件的四位数开始,最后总能变成6174。因此,卡布列卡风趣地把6174叫做卡布列卡常数。
例如,我们从4231开始,首先把4231重新排列成4321和1234,两数相减得3087;再把3087重新排列成8730和0378,两数相减得8382;再把8352重新排列成8532和2358,相减得6174;再把6174重新排列成7641和1467,两数相减仍然得6174。
4231:4231-1234=3087
3087:8730-0378=8352;
8352:8532-2358=6174;
6174:7941-1467=6174。
请你设计一个程序,验证卡布列卡猜想。并把验证猜想的每一步结果打印出来。
(选自《中学生数学》期刊 2001年11月(上))
文章评论评论内容只代表网友观点,与本站立场无关!