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

1.3 平方数汇趣

一个整数的2次幂称为平方数(又称完全平方数)。例如,36=62,121=112等都是平方数。本节探讨平方数的几个有趣的问题。

1.3.1 “1和2”的平方数

国外文献中有标题“1和2”的趣题给出了一类平方数的独特构成。本节在给出简单求解基础上适当拓展。

【问题】 “1和2”操作为什么是平方数?

连续写偶数个1,再连续写位数为其一半的2,然后两数相减,所得的差是一个平方数。

例如,11-2=9=32;1111-22=1089=332;……

你能说明这是为什么吗?

【探求】 设2的位数为k(k>0),则1的位数为2k。

同时,记连续k个1的值为m,记连续2k个1的值为c,记连续k个2的值为b,显然b=2m,记其差为d=c-b。

把c分为前后两段,每段k个1,显然低段即为m,高段为m×10k,而10k=9m+1,有

c=m×10k+m=m(10k+1)=m[(9m+1)+1]=9m2+2m

d=c-b=(9m2+2m)-2m=9m2=(3m)2

即所写两数之差为整数3m的平方,这里m为连续写k个1的值。

例如,k=2时,1111-22=(9×112+2×11)-2×11=9×112=(33)2

再如,k=3时,111 111-222=(9×1112+2×111)-2×111=9×1112=(333)2

【拓展】 “a和2a”操作是平方数吗?

(1)设计要点。

把“连续写偶数个1,再连续写位数为其一半的2”拓展为:连续写偶数个a,再连续写位数为其一半的2a。

为确保2a为一个数字,要求键盘输入a为1,2,3,4。

建立位数循环i(1≤i≤7),即最多生成2∗i=14位。

循环中根据a生成b,c,并求其差。

连续写偶数个a:

c=c∗100+a∗10+a;

再连续写位数为其一半的2a:

b=b∗10+2∗a;

判断其差d=c-b是否为平方数,若是,则输出平方式。

(2)拓展程序设计。

(3)拓展程序运行结果。

由程序运行可知,“1和2”可得单数码平方数,同时“4和8”也可得单数码平方数。而当a=2或3时,没有单数码平方数输出。

程序只设计到14位,实际上问题对位数没有限制。

1.3.2 数字同奇偶平方数

你见过各位数字都是偶数的平方数吗?或者你见过各位数字都是奇数的平方数吗?

给出以下5个数:

1448,56 163,127 452,15 773 579,242 888 426

请简单判断其中哪些平方数错了,并说明理由。

同学们各抒己见:

平方数的个位数字不可能为2,3,7,8,因而前3个不是平方数。

第4个数各位数字为奇数,第5个数各位数字为偶数,是不是平方数,意见不一。

那么,组成数字同奇偶的整数可能是平方数吗?

【命题1】 不存在各位数字全为奇数的多位平方数。(这里所说的多位平方数,是指2位或2位以上平方数。)

【证明】 设d=a2,a为正整数,d为a的平方数。

若a为偶数,则d为偶数,其个位数字不为奇数。

若a为奇数,下面证明d的十位数字不为奇数。

不妨设a=10k+m,这时k为非负整数,m为一位奇数。则

若k=0,则一位奇数m的平方m2为12=1,32=9,52=25,72=49,92=81,其中,后3个平方数为2位数,其十位数字均为偶数。

若k>0,据式(1)知平方数d的十位数字为(10k2+2km)与m2的十位数字之和的个位数字,注意到(10k2+2km)为偶数,m2的十位数字为偶数,其和为偶数,即平方数d的十位数字为偶数。

因而证得:一个平方数如果至少有两位,其各位数字不可能全为奇数。

【命题2】 不存在各位数字都是偶数且其个位数字为6的多位平方数。

【证明】 假设d=a2,d的各位数字均为偶数,其个位数字为6。

因为d的个位数字为6,则a的个位数字只能为6或4。

(1)设a=10k+6,这时k为非负整数,则

据式(2)知平方数d的十位数字为奇数(10k2+12k+3)的个位数字,显然为奇数,与各位数字均为偶数矛盾。

(2)设a=10k+4,这时k为非负整数,则

据式(3)知平方数d的十位数字为奇数(10k2+8k+1)的个位数字,显然为奇数,与各位数字均为偶数矛盾。

因而证得:一个多位平方数的各位数字都是偶数,其个位数字不为6。

注意到数字2与8不为平方数的尾数字,因而得:如果一个多位平方数的各位数字都是偶数,其个位数字只能为0与4。

【拓展】 搜索全为偶数数字组成且末位非0的n位平方数。

(1)编程要点。

设d=a2,d的各位数字均为偶数,则(10a)2=100d即为在d的尾部添加两个0,显然各位数字也符合要求。为了消除这种衍生状态,约定整数a的个位数字不为0。

计算最小的n位数10^(n-1)开平方取整数b,最大的n位数(10^n)-1开平方取整数c,以b+1,c作为循环的初值与终值设置a枚举循环。

计算n位平方数d=a∗a,通过求余(%)与整除(/)分离d(w=d)的每一位数字k,若其中某一个数字k为奇数(k%2>0),则标注t=1返回。

若t=0,说明平方数d中没有奇数数字,符合全偶数要求,则输出全为偶数数字的n位平方数d,并用变量e统计个数。

(2)程序设计。

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

我们注意到,搜索并输出的7位平方数各位数字全部为偶数,且其个位数字全部为4。因为个位排除了0,平方数的个位不可能为2,8,上面证明了各位数字全部为偶数的平方数的个位数不能为数字6,所以结尾为清一色的4。

1.3.3 优美平方数

称不含重复数字的完全平方数为优美平方数。

试在0,1,2,…,9这10个数字中指定排除m个数字,从其余10-m个数字选n个,组成没有重复数字的n位优美平方数。

从键盘输入位数n及指定排除数字个数m(m+n≤10),并依次输入m个排除数字,输出所有满足以上要求的平方数(如果无须排除数字,则输入m=0)。

1. 设计要点

从键盘输入指定位数n,指定排除数字个数m,若m+n>10则返回。

(1)枚举与分离。

把从键盘输入指定排除的m个数字存储到数组g[k](k=1~m)。

计算最小的n位数10^(n-1)开平方取整数b,最大的n位数(10^n)-1开平方取整数c,以b+1,c作为循环的初值与终值设置a枚举循环。

计算d=a∗a,显然d为n位平方数。

通过求余(%)与整除(/)分离d的每一位数字k,并用f[k]++;统计数字k的频数。

(2)判别与输出。

若f[k]>1(k=0~9),说明数字k重复,标记t=1。

用变量s统计f[g[k]](k=1~m)之和,若s>0,说明平方数中含指定排除数字。

经以上测试,若t=0且s=0,说明平方数d中既没有重复数字,也没有指定排除数字,符合搜索要求,则逐个输出,并用变量e统计个数。

2. 程序设计
3. 程序运行示例与说明

以上7个7位优美平方数是排除数字2,3,9之后所剩7个数字全排列数的一个子集。

如果排除5个偶数数字,可验证不存在5位或5位以下全由奇数数字组成的平方数。

运行程序时如果输入n=10,m=0(即不排除任何数字),则输出10个由数字0~9组成的10位优美平方数。

运行程序,如果输入n=9,m=1,输入排除数字0,则输出30个由数字1~9组成的9位优美平方数。