1701005637
1701005638
1701005639
1701005640
严格上来讲,如图3-1所示的天然幻方不是幻方,因为幻方不包含重复的数字。然而忽略这个约束,从到这18个分数的小数循环节是神奇的,特别是对于第一列和第一行的数字,从0~9依次排序的,足见其奇幻。
1701005641
1701005642
1701005643
1701005644
1701005646
我和数学有约:趣味数学及算法解析 3.7 回文数
1701005647
1701005648
【问题】什么是回文数?
1701005649
1701005650
【分析】
1701005651
1701005652
一个数正读反读都一样,我们就把它叫做“回文数”。随便选一个数,不断加上把它反过来写之后得到的数,直到得出一个回文数为止。
1701005653
1701005654
例如,所选的数是67,两步就可以得到一个回文数484:
1701005655
1701005656
67+76=143
1701005657
1701005658
143+341=484
1701005659
1701005660
把69变成一个回文数则需要四步:
1701005661
1701005662
69+96=165
1701005663
1701005664
165+561=726
1701005665
1701005666
726+627=1353
1701005667
1701005668
1353+3531=4884
1701005669
1701005670
89的“回文数之路”则特别长,要到第24步才会得到第一个回文数——8813200023188。
1701005671
1701005672
我们或许会想,不断地“一正一反相加”,最后将总能得到一个回文数,即对于几乎所有的数,按照规则不断加下去,迟早会出现回文数。
1701005673
1701005674
不过,196却是一个相当引人注目的例外。数学家们已经用计算机算到了3亿多位数,都没有产生过一次回文数。从196出发,究竟能否加出回文数来?这至今仍是个谜。
1701005675
1701005676
基于此流程,编写回文数迭代MATLAB程序如下:
1701005677
1701005678
function ysw3_3 clc,clear,close all %清屏和清除变量 warning off %消除警告 a=89; %输入一个数字 b = num2str(a); %字符格式 c = swap(b); %方向取反 1234 —> 4321 d = str2num(c); %数字格式 if a==d return; else d = 0; d1 = 1; %字符格式 d2 = 2; %方向取反 1234 —> 4321 d3 = 3; %数字格式 while d~=d3 d = d+a; d1 = num2str(d); %字符格式 d2 = swap(d1); %方向取反 1234 —> 4321 d3 = str2num(d2); %数字格式 a = d3; end disp([‘回文数: ‘,num2str(d3)]) end end function MA=swap(ma) %该函数实现数字的倒序,如1234 —> 4321 ma1=ma; %赋值 Nma=size(ma,2); %列大小 maij=(Nma(1,1)
:-1:1)’; [ma(1,
:),ma(maij)] = deal(ma(1,maij),ma(1,
:)); %deal函数交换顺序 MA=ma; %赋值 ma=ma1; %赋值 end
1701005679
1701005680
运行程序输出结果如下:
1701005681
1701005682
a=89; %输入一个数字 回文数: 8813200023188 a=67; %输入一个数字 回文数: 484 a=69; %输入一个数字 回文数: 4884 a=17; %输入一个数字 回文数: 88
1701005683
1701005684
1701005685
1701005686
[
上一页 ]
[ :1.701005637e+09 ]
[
下一页 ]