[题目描述]
自守数是指一个数的平方的尾数等于该数自身的自然数。
例如:
25^2=625
76^2=5776
9376^2=87909376
请求出 200000 以内的自守数?
输入格式:
此题无输入。
输出格式:
输出 200000 以内的自守数(包括 0, 数之间用两个空格分开)。
样例输入
样例输出
对于 100% 的数据,保证都符合题目要求。
提示说明:
若采用“求出一个数的平方后再截取最后相应位数”的方法显然是不可取的,因为计算机无法表示过大的整数。分析手工方式下整数平方(乘法)的计算过程,以 376为例:376 被乘数
X 376 乘数
2256 第一个部分积=被乘数乘数的倒数第一位
2632 第二个部分积=被乘数乘数的倒数第二位
1128 第三个部分积=被乘数*乘数的倒数第三位
141376 积
本问题所关心的是积的最后三位。分析产生积的后三位的过程,可以看出,在每一次的部分积中,并不是它的每一位都会对积的后三位产生影响。总结规律可以得到:在三位数乘法中,对积的后三位产生影响的部分积分别为:
第一个部分积中:被乘数最后三位乘数的倒数第一位
第二个部分积中:被乘数最后二位乘数的倒数第二位
第三个部分积中:被乘数最后一位*乘数的倒数第三位
将以上的部分积的后三位求和后截取后三位就是三位数乘积的后三位。这样的规律可以推广到同样问题的不同位数乘积。
按照手工计算的过程可以设计算法编写程序。
来源/分类(难度系数:一星)
完整代码展示:
# coding=utf-8
a=[]
for i in range(0,200001):
num = i*i
if num%10 ==i:
a.append(i)
elif num%100 ==i:
a.append(i)
elif num%1000==i:
a.append(i)
elif num%10000==i:
a.append(i)
elif num%100000==i:
a.append(i)
elif num%200000==i:
a.append(i)
for i in range(0,len(a)):
print(a[i],end=" ")
代码解释:
“a=[] ”,建立一格空列表a,用于储存0~200000的自守数。
“for i in range(0,200001):
num = i*i
if num%10 ==i:
a.append(i)
elif num%100 ==i:
a.append(i)
elif num%1000==i:
a.append(i)
elif num%10000==i:
a.append(i)
elif num%100000==i:
a.append(i)
elif num%200000==i:
a.append(i) ”,根据自守数的定义,依次遍历从0~20000的所有数值,查找符合条件的数值并将其添加进列表a中。
“for i in range(0,len(a)):
print(a[i],end=" ") ”,依次打印列表a中的元素,每两个元素之间插入两个空格。
运行效果展示:
(声明:以上内容均为原创)