【趣味学算法】 09_回文数

注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备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是回文数
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值