趣味数学及编程拓展
上QQ阅读APP看书,第一时间看更新

1.7 雅趣守形数

本节探讨守形数,其特性表现在其平方数的尾部。

定义:若正整数n是它平方数的尾部,则称n为守形数,又称同构数。

例如,6是其平方数36的尾部,25是其平方数625的尾部,6与25都是守形数。

首先利用守形数的特性简单求解3位守形数,在此基础上编程拓展求指定区间内的守形数,并进一步探求多位守形数。

1.7.1 探索区间守形数

先求解一个简单的守形数问题。

【问题】 共有多少个3位守形数?

【思考】 从个位开始向高位逐位探求。

(1)除了5与6外,1能否构成守形数的尾部?

回答是否定的。事实上,12=1,1是1的平方,而不是其平方数的尾部。

设2位整数a=10k+1(即a的十位数字是k>0),只要证a2的十位数字不为k即可。

a2=(10k+1)2=10(10k2+2k)+1

可见,a2的十位数字是2k的个位数字,无论k>0为何数字,2k的个位数字都不可能为数字k。

(2)任意n位守形数必为n-1位守形数。

要求3位守形数,可先求出所有2位守形数。

①设a=10k+5为个位数字为5,十位数字为k(k>0)的2位整数,则

a2=(10k+5)2=100(k2+k)+25

显然a2的最低2位为25,其十位数字为2。

即要使a为守形数,只有k=2,即a=25这一个解。

②设a=10k+6为个位数字为6,十位数字为k(k>0)的2位整数,则

a2=(10k+6)2=100(k2+k)+10(2k+3)+6

显然a2的十位数字为(2k+3)的个位数字,即(2k+3)%10。

由(2k+3)%10=k,推得有k=7,即a=76这一个解。

(3)在2位守形数基础上配置首位。

①设a=100k+25,即低2位为守形数25,百位数字为k(k>0)的3位整数,则

a2=(100k+25)2=1000(10k2+5k)+625

显然a2的最低3位为625,其百位数字为6。

即a为个位数字是5的3位守形数,百位数字k=6,即a=625这一个解。

②设a=100k+76为低2位为守形数76,百位数字为k(k>0)的3位整数,则

a2=(100k+76)2=1000(10k2+15k+5)+100(2k+7)+76

显然a2的百位数字为(2k+7)的个位数字,即(2k+7)%10。

由(2k+7)%10=k,推得有k=3,即a=376这一个解。

(4)综合以上可知共两个3位守形数:

3762=141 376

6252=390 625

依此可求出4位、5位守形数。

【拓展】 试探求指定区间[x,y]内所有守形数。

(1)设计要点。

为了扩大探求范围,变量类型设置为double型。

对指定范围[x,y]内的每一个整数a(约定a>1),求出其平方数s;计算a的位数k,同时计算b=10^k,a的平方s的尾部c=fmod(s,b);比较整数a与其平方数的尾部c,若a=c则输出守形数。

(2)程序设计。

(3)程序运行示例与说明。

以上结果可见,没有5结尾的4位守形数,也没有6结尾的5位守形数,实际上是因为其最高位为0而没有显示。

由输出的第2个解与第4个解比较可知,0625即为5结尾的4位守形数,因其高位为0,自然不输出。

同样,由输出的第3个解与第5个解比较可知,09376即为6结尾的5位守形数,因其高位为0而没有输出。

1.7.2 展现多位守形数

以上设计搜索到2个3位守形数、1个4位守形数、1个5位守形数、2个6位守形数。守形数的个位数字为5或6。

试探索一般n位守形数。

1. 设计要点

为了求更多位数的守形数,可应用守形数的性质:

一个m位守形数的尾部k(1≤k≤m-1)位数也是一个高位可能为0的守形数。

事实上,a是一个m位数,a的平方数的尾部k位仅由a的尾部k位决定,而与a的其他位无关。

实施易知一位守形数有5,6,则二位守形数的个位数字只可能是5,6这两个数字。根据这一思路,我们可应用递推求解。

设置数组a[k]存储守形数的第k位:守形数的个位数字a[1]选取d(5~6),a[k](k>1)选取j(0~9)。同时,设置b数组存储计算平方的中间值,设置c数组存储计算守形数的平方值,应用“竖式乘模拟”计算平方数。

通过比较若有a[i]=c[i](i=1,2,…,k)成立,则k位守形数确立,继续递推下一位,直至n位确定并打印输出。

2. 程序设计
3. 程序运行示例与变通

注意到以上结果中“5结尾的守形数”中没有4位守形数,“6结尾的守形数”中没有5,12,13与20位守形数,只是其最高位为0而已(由其高一位结果可看出)。

变通:试把守形数的尾数从5,6扩展到0~9,即改变尾数d循环,由for(d=5;d<=6;d++)变为for(d=0;d<=9;d++)。变通后运行程序,可知除5,6结尾外,其他数字结尾没有守形数。