马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 2021-8-19 19:14 编辑
在线视频:
这一讲我们来看“自守”数,注意哈,不是自首~
自守数是什么呢?
这种数是指一个数的平方的尾数等于该数自身的自然数。
例如:
接下来我们通过编程找出求 100000 以内的自守数。
根据要求,关键就是知道当前所求自然数的位数,以及该数平方的尾数与被乘数、乘数之间的关系。
一讲一讲学到现在,我们第一时间想到的应该是在13 - 数之吟唱:回文中那样拆分。
先求平方,然后按照原数长度就“切”平方后的结果。
既然如此,我们先动手实现求给定数的位数。
我们可以借助最高位的权值来计算。
对于十进制来说,个位的权值为 100,十位的权值为 101,百位的权值为 102,以此类推。
一个存储三位数的变量 n=233,每次地板除 10,将得到的值再赋给 n,直到 n 的值为 0,最多可以除 3 次;
若变量 n 中存储的是 4 位数,用同样的方法去地板除 10 最多可以除 4 次。
相信应该有童鞋已经发现当变量变为 0,地板除 10 的次数即为当前给定数的位数。
先将上面的过程写成代码:
print("输入任意一个正整数:",end="")
n = int(input())
if n<= 0:
print("不可以这么输入哦!")
exit()
count = 0
while n != 0:
n //= 10
count += 1
print("位数为",count)
运行一下:
里面加了防止用户输入错误数字的判断,以后代码有需要,直接拿来用就好。
知道了怎么求位数,那么按照正常逻辑,就是将平方后的数拆分了对吧。
按照位数分离给定数的最后几位。
先从一个两位数开始分析,分离最低位个位:
对于三位数,分离最后两位:
对于四位数,分离最后三位:
以此类推,发现规律了吧,若分离出最后 x 位,只需要用原数对 10x 求余就好。
因为现在是循环 0 到 100000 之间的数,初始值位数最多不过从 1 到 5 位。
按照位数依次取余就好,这个“笨笨”的方法,留给你们当课后作业了!
这里其实还有更简单的做法,根本不用找出位数,反正最多 5 位,那就直接利用 if..elif % 10n 就能搞定!
代码:
结果:
这种方法肯定比刚才说的第一种,先统计位数,再去 % 判断来的简单~
源码:
py15.py.zip
(687 Bytes, 下载次数: 9, 售价: 6 鱼币)
其实除了上面这种判断位数操作,还可以将数字转为字符串判断长度:
快速找到几位数,然后求解,算是精简第一种方法:
for n in range(1,10000):
# 求数的长度
k=len(str(n))
# 计算数的后几位
t=(n*n) % (10**k)
if t==n:
print(n)
当你水平更高的时候,甚至可以使用列表解析式一行代码搞定:
print([n for n in range(1,10000) if (n*n) % (10**len(str(n)))==n])
这就是算法设计的魅力,不同段位的人写出不一样的代码~
这节课信息量有点大,留给童鞋们自己去好好消化,下课! |