鱼C-小师妹 发表于 2021-7-19 17:46:34

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-19 18:53:48

本帖最后由 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}")

鱼C-小师妹 发表于 2021-7-19 20:35:16

qiuyouzhi 发表于 2021-7-19 18:53
沙发

不错不错,0和1也算噢

深谙流年 发表于 2021-7-19 21:25:05

for i in range(999999):
    i_1 = str(i**2)
    if str(i) == i_1[-len(str(i)):]:
      print(i,i_1)

qiuyouzhi 发表于 2021-7-20 10:38:28

鱼C-小师妹 发表于 2021-7-19 20:35
不错不错,0和1也算噢

噢,忘了,感谢!{:10_256:}

hornwong 发表于 2021-7-20 11:45:32

{:5_95:}

鱼C-小师妹 发表于 2021-8-20 09:44:18

视频更新啦!!!

傻眼貓咪 发表于 2021-10-10 14:22:47

代码:) == n)]输出:0
1
5
6
25
76
376
625
9376
90625

LyyLD 发表于 2021-11-5 16:26:55

{:5_90:}

游刃鱿鱼 发表于 2021-11-8 21:23:03

我太笨了!把我自己都写晕了。
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}个自守数')

春风亭朝小树 发表于 2021-11-30 11:08:31

瞧瞧代码

张亚当 发表于 2022-2-17 02:55:14

{:5_111:}

CG2022 发表于 2022-3-8 23:09:01

{:10_254:}

Hyjxsssss 发表于 2022-5-9 11:02:07

# 题干
# 自守数是指一个数的平方的尾数等于该数自身的自然数
# 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)

憨憨学py 发表于 2022-7-25 18:22:05

print("100000以内的自守数:")
for i in range(100000):
    count = len(str(i))
    if i == i * i % (10 ** count):
      print(i, "是自守数")

憨憨学py 发表于 2022-7-25 18:34:36

不判断位数的话,循环去除是不是更简单些
for i in range(0, 100000):
    num = i * i
    for j in range(1, 6):
      if num % (10 ** j) == i:
            print('{}是自守数'.format(i))
            break

语与余 发表于 2022-11-14 16:33:47

#第一种
for i in range(100000):
    num = i*i
    k = len(str(i))
    if i == num%(10**k):
      print(i)

#第二种
print()

Alexiiis 发表于 2023-6-5 21:48:01

沙发

pingkong 发表于 2023-11-2 09:18:10

学习一下下
页: [1]
查看完整版本: 15 - 数之吟唱:自守数