当前位置:免费教育资源网论文数学论文
关键字: 所属栏目:

用计算机在局部范围内验证数学猜想(二)

来源:互联网  作者:佚名  更新时间: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月(上)) 



文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
栏目导航
本类热门阅览
相关文章
精彩推荐