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位优美平方数。