注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备python语言基础,本人小白,如内容有误感谢您的批评指正
回文”是指正读反读都一样的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。
在数学中也有这样一类数字有这样的特征,称为回文数。
那么想要求1~256中其平方是回文数的数该如何实现呢?
我们可以将n平方后的结果x对10进行取余将每位数拆分存到一个数组里,然后将数组中的元素按下标从大到小的顺序取出乘以所在位置的权值并求和得到新数y,再将y与x进行比较即可得出是否为回文数
m = [0]*5
count = 0
for x in range(1,257):
n,i,a =0,0,x*x
#拆分
while a != 0:
m[i] = a % 10
a //= 10
i += 1
for index in range(i):
n += m[index]*10**(i-1)
i -= 1
if n == x*x:
count += 1
print('{}的平方{}是回文数'.format(x,x*x))
print('\n在1~256的平方中一共有{}个回文数'.format(count))
输出结果:
1的平方1是回文数
2的平方4是回文数
3的平方9是回文数
11的平方121是回文数
22的平方484是回文数
26的平方676是回文数
101的平方10201是回文数
111的平方12321是回文数
121的平方14641是回文数
202的平方40804是回文数
212的平方44944是回文数
在1~256的平方中一共有11个回文数
还有另外一种思路是将拆分后的数字的对称位置的数字进行对比看是否都相等
m = [0] * 5
count = 0
print("序号 数字 平方回文")
for n in range(1, 256):
f, i, t, a=0, 0, 1, n*n
squ = a
while a !=0:
m[i] =a % 10
a //= 10
i += 1
index = 0
while index <= i//2:
if m [index] != m[i-1-index]:
break
if (i==1 and m[index] == m[i-1-index])or index == i//2-1:
count+=1
print("{:2}{:5}{:6}".format(count,n,n*n))
index+=1
输出结果:
序号 数字 平方回文
1 1 1
2 2 4
3 3 9
4 11 121
5 22 484
6 26 676
7 101 10201
8 111 12321
9 121 14641
10 202 40804
11 212 44944
以上思路均针对特定场景,位数基本确定的情况,那么如果想求任意范围内的回文数要怎么做呢!判断依据还是一样的,只不过写法不太一样,让我们看看以下这个例子,把一个3位数倒过来的过程,数学就是很奇妙啦,
观察规律,找到通式那么代码实现就变得轻松了起来!只需要把范围修改为输入的变量即可自定义范围啦。
for n in range(1,257):
num = n*n
k = len(str(num))-1
i = 0
S = 0
while i <= k:
S += (num//10**i%10)*10**(k-i)
i += 1
if S==num:
print("{}的平方{}是回文数".format(n,num))
输出结果
1的平方1是回文数
2的平方4是回文数
3的平方9是回文数
11的平方121是回文数
22的平方484是回文数
26的平方676是回文数
101的平方10201是回文数
111的平方12321是回文数
121的平方14641是回文数
202的平方40804是回文数
212的平方44944是回文数