为深化素质教育,提高学生技术核心素养,浙江和广东已将编程列为高考选考科目。根据当前编程语言的趋势,浙江省在几年前将编程语言从VB更换为Python。这是一道来自浙江新高考的数学编程Python例题。

01

循环数例题

请编写Python程序,实现以下功能:若一个n位的数字串满足下述条件,则称其是循环数。将这个数字视为整数(可能带有前导 0),并用任意一个 1到 n之间(包含1和 n)的整数去乘它时,会得到一个整数列。这个整数列是将原数字串首尾相接后,再在某处断开而得到的新数字串。例如142857就是循环数,142857是个6位数,因此将142857与1~6之间任意数字相乘得到的结果都是将142857数字断开相接后的结果,是不是很神奇?那么请你思考下,当用户输入一个数字后,如何判断它是否符合循环数规则。

142857 × 1 = 142857

142857 × 2 = 285714

142857 × 3 = 428571

142857 × 4 = 571428

142857 × 5 = 714285

142857 × 6 = 857142

02

解题思路

这道题目的难点在于对结果进行判断,假设我们输入的数字是142857,那么我们需要判断两数相乘的结果在142857,428571,285714,857142,571428,714285这几个数字中。这些数字无非就是将原数字转化为字符串后重新拆分得到的结果。

这里小陈老师给大家提供一个思路,我们可以将所有的结果存储在一个list集合列表当中。这样判断数字相乘的结果是否包含在这些列表中即可,若在判断过程中发现不满足条件时,立刻结束反馈此数字不是循环数,若满足条件我们继续执行,若数字与n位相乘都满足条件反馈此数字是循环数(图1)。

打开网易新闻 查看精彩图片

03

代码编写

思路梳理完成后我们可以着手编写代码了,这里我使用了Python语言进行代码的编写,当然最重要的还是思路也可以使用其他语言来完成。

首先我们设置一个字符串用于用户自定义输入num,这里最好进行一下判断,判断用户只能输入数字,不能输入其他字符。否则后续执行过程中会报错。

然后我们新增一个list列表用于保存将输入数字串首尾相接后,再在某处断开而得到的新数字串。

根据num的长度进行循环操作,在循环的过程中我们需要对原先的字符串进行拆分拼接处理。这里是一个蛮巧妙的算法,我们先获取到循环的索引,然后根据索引的位置我们对原数字进行拆分,比如索引为1,这里我们把原数字拆分成两个部分,比如142857我们就把它拆分成1和42857两部分。然后我们对两部分进行位置的转换拼接获得428571,将结果存入到list列表中。

将所有的结果都存入到list列表后,我们可以根据数字和(1-n之间的位数)相乘进行判断,判断结果是否在列表中,若结果不在列表中直接flag=false不满足条件跳出循环,若结果在列表中则继续执行下一次,直至全部满足条件说明该数字是循环数(图2)。

打开网易新闻 查看精彩图片

题目的难度不算太大,难点在于如何将结果进行存储并验证,这里的思路和过程实现还是很巧妙的。

已知的一些循环数:

142857 (6位)

0588235294117647 (16位)

052631578947368421 (18位)

0434782608695652173913 (22位)

0344827586206896551724137931 (28位)

你可以看到除了142857以外,其他几个循环数都有前导0,因此如果要判断有前导0的循环数需要加两行代码,先将这个列表前导数0去除,然后转化字符串类型即可。
nums = [int(num.lstrip('0')) for num in list1]
# 将列表类型转化为字符串类型
str_nums = [str(num) for num in nums]

文章的最后可以给大家增加一些难度,如果想知道所有从1位数到10位数总共有多少个循环数,请全部列举出来,如何实现呢?那么其他二进制、八进制、十六进制的循环数你能求出来吗?

编辑|张毅

审核|吴新

爆料联系:cpcfan1874(微信)

壹零社:用图文、视频记录科技互联网新鲜事、电商生活、云计算、ICT领域、消费电子,商业故事。《中国知网》每周全文收录;中国科技报刊100强;2021年微博百万粉丝俱乐部成员;2022年抖音优质科技内容创作者