阅读以下说明和流程图,填写流程图中的空缺,将解答填入答题纸的对应栏内。
【说明】
下面流程图旨在寻找所有符合以下条件的9位数:其各位数字非0且互不相同,其前K(1<=K<=9)位数字构成的数是K的倍数(能被K整除)。例如,381654729就是符合条件的数,其前2位数字构成的数38能被⒉整除,其前3位数字构成的数381能被3整除,依此类推。
该流程图中,数组M存储着全部由数字1~9的排列组成的9!个整数,对其中每个整数,分别按K=9,8,...2,取前K位数字构成的数(用T表示),判断T是否能被K整除。变量N用于计算符合条件的整数的个数。
【流程图】
注1:“循环开始”框内给出循环控制变量的初值、终值和增值(默认为1),格式为:
循环控制变量=初值,终值[,增值]
注2:函数 int(x)的结果是取x的整数部分(向下取整),即不超过x的最大整数。
本题考查程序流程图的设计和理解能力。
该流程图开始处,需要对一些变量赋初值:符合条件的数的个数N清0,9个不同的非0数字排列的9位数的个数赋值“9!”。接着,对i=1,2,…,L进行循环:判断每个M(i)是否符合条件。由于在判断过程中需要对M(i)加工变换处理,为此要把它先赋值给临时变量T,仅对T进行变换处理,保留M(i)不变,以便在需要时输出它。
T的值是个9位数。为判断它的前K位数是否为K的倍数,按K=9,8,7,…,2的顺序处理更为方便。K=1可以不用处理,因为任何整数都是1的倍数。为此,开始时先给K赋值9。为判断T是否为K的倍数,只要判断K*int(T/K)是否等于T。如果T是K的倍数,那么T/K是整数,其整数部分int(T/K)=T/K,从而有K*int(T/K)=T;如果T不是K的倍数,那么int(T/K)<T/K,从而有K*int(T/K)不等于T。为此,流程图的空(1)处应填入T/K。
如果T不是K的倍数(判断框False出口),那么该M(i)不符合条件,需要继续对下一个i进行循环处理。如果T是K的倍数(判断框True出口),那么需要对下一个K进行处理,即需要将K值减1。为此,流程图的空(2)处应填K-1。而T值应去掉最右一位后再进行处理,int(T/10)就是将T去掉最低一位。接着需要判断K是否已达到1或0。如果K>1,则还需要继续判断T是不是K的倍数;如果K=1或0,就说明对K=9,8,…,2都已处理完毕,说明该M(i)符合条件,需要输出 M(i),并对N增1计数。为此,流程图中的空(4)处应填1或0,空(5)处应填N+1一N。
i循环结束后,打印符合条件的数的个数N。
运行结果发现:N=1,381654729是唯一符合条件的9位数。