Python练习(5)

问题描述

自守数
如果某个数的平方的末尾几位等于这个数,那么就称这个数为自守数。显然,5和6是一位自守数(5 * 5=25,6 * 6=36)。 25 * 25=625,76 * 76=5776,所以25和76是两位自守数。求10000以内的自守数。

自己的代码

def zishou(n):                        #构造判断函数
    b=n**2
    a=[int(i) for i in str(b)]         # 把n 和n*n每一位的数字读出来放到列表里
    c=[int(k) for k in str(n)]
    l1=len(c)                         #求出各自的长度
    l2=len(a)
    if c==a[l2-l1:]:				#把n*n切片,后几位如果和n相等,输出n
        print n
        
for m in range(1,10000):
    zishou(m)
#结果
1
5
6
25
76
376
625
9376

下面是网上的,更加简洁,还是读懂题意再下手,分析题意背后的意义。

网上更简洁的

for n in range(1, 10000):
    l = len(str(n))
    t = n * n % (10 ** l)      #取余,直接求出最后几位数字,简单粗暴直接
    if t == n:
        print n

将整数转换为字符str(n),int(n)将字符转换为整数
所以看自己的代码觉得麻烦了,其实没必要把字符串每一个都取出来放到新的数组里,直接比较即可,字符串之间也能比较是否相等

自己的又改进了一下

def zishou(n):
    b=n**2
    l1=str(n)                  #n 和n*n直接当做字符串处理,无需建立新的数组
    l2=str(b)
    if l1==l2[len(l2)-len(l1):]:   #切片,比较最后几位组成的字符串和n是否相等
        print n
        
for m in range(10000):
    zishou(m)

猜你喜欢

转载自blog.csdn.net/qq_43243022/article/details/82913299