问题描述
自守数
如果某个数的平方的末尾几位等于这个数,那么就称这个数为自守数。显然,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)