15 - 数之吟唱:自守数
本帖最后由 不二如是 于 2021-8-19 19:14 编辑在线视频:
https://www.bilibili.com/video/BV1HT4y1K7DY?p=17
https://xxx.ilovefishc.com/forum/202105/31/204333obvdca8ankppcn9v.png.thumb.jpg
这一讲我们来看“自守”数,注意哈,不是自首~
自守数是什么呢?
这种数是指一个数的平方的尾数等于该数自身的自然数。
例如:
52=25
252=625
762=5776
接下来我们通过编程找出求 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)
运行一下:
里面加了防止用户输入错误数字的判断,以后代码有需要,直接拿来用就好。
知道了怎么求位数,那么按照正常逻辑,就是将平方后的数拆分了对吧。
按照位数分离给定数的最后几位。
先从一个两位数开始分析,分离最低位个位:
n%10
对于三位数,分离最后两位:
n%100
对于四位数,分离最后三位:
n%1000
以此类推,发现规律了吧,若分离出最后 x 位,只需要用原数对 10x 求余就好。
因为现在是循环 0 到 100000 之间的数,初始值位数最多不过从 1 到 5 位。
按照位数依次取余就好,这个“笨笨”的方法,留给你们当课后作业了!
这里其实还有更简单的做法,根本不用找出位数,反正最多 5 位,那就直接利用 if..elif % 10n 就能搞定!
代码:
**** Hidden Message *****
结果:
这种方法肯定比刚才说的第一种,先统计位数,再去 % 判断来的简单~
源码:
其实除了上面这种判断位数操作,还可以将数字转为字符串判断长度:
count=len(str(n))
快速找到几位数,然后求解,算是精简第一种方法:
for n in range(1,10000):
# 求数的长度
k=len(str(n))
# 计算数的后几位
t=(n*n) % (10**k)
if t==n:
print(n)
当你水平更高的时候,甚至可以使用列表解析式一行代码搞定:
print()
这就是算法设计的魅力,不同段位的人写出不一样的代码~
这节课信息量有点大,留给童鞋们自己去好好消化,下课! 本帖最后由 qiuyouzhi 于 2021-7-20 10:38 编辑
沙发{:10_307:}
for i in range(99999):
if i == i ** 2 % (10 ** len(str(i))):
print(f"{i} ** {i} == {i ** 2}") qiuyouzhi 发表于 2021-7-19 18:53
沙发
不错不错,0和1也算噢 for i in range(999999):
i_1 = str(i**2)
if str(i) == i_1[-len(str(i)):]:
print(i,i_1) 鱼C-小师妹 发表于 2021-7-19 20:35
不错不错,0和1也算噢
噢,忘了,感谢!{:10_256:} {:5_95:} 视频更新啦!!! 代码:) == n)]输出:0
1
5
6
25
76
376
625
9376
90625 {:5_90:} 我太笨了!把我自己都写晕了。
n = 0
count = 0
while n <= 100000:
m = n*n
if n < 10:
if m < 10:
if m == n:
print(f'{n}是自守数')
count += 1
else:
if (m%10) == n:
print(f'{n}是自守数')
count += 1
elif n < 100:
if (m%100) == n:
print(f'{n}是自守数')
count += 1
elif n < 1000:
if (m%1000) == n:
print(f'{n}是自守数')
count += 1
elif n < 10000:
if (m%10000) == n:
print(f'{n}是自守数')
count += 1
else:
if (m%100000) == n:
print(f'{n}是自守数')
count += 1
n += 1
print(f'100000以内共有{count}个自守数')
瞧瞧代码 {:5_111:} {:10_254:} # 题干
# 自守数是指一个数的平方的尾数等于该数自身的自然数
# 5^2=25 25^2=625 76^2=5776
# 找出求 100000 以内的自守数
count = 0
for n in range(100001):
length = len(str(n))
N = n * n
N_mod = str(N)[-length:]
if N_mod == str(n):
print('%d是自守数:%d^2 = %d' % (n, n, N))
count += 1
continue
else:
pass
print('0 - 100000 中共有%d个自守数' % count) print("100000以内的自守数:")
for i in range(100000):
count = len(str(i))
if i == i * i % (10 ** count):
print(i, "是自守数") 不判断位数的话,循环去除是不是更简单些
for i in range(0, 100000):
num = i * i
for j in range(1, 6):
if num % (10 ** j) == i:
print('{}是自守数'.format(i))
break #第一种
for i in range(100000):
num = i*i
k = len(str(i))
if i == num%(10**k):
print(i)
#第二种
print() 沙发 学习一下下
页:
[1]