首页 > 试题广场 >

回文数

[编程题]回文数
  • 热度指数:5528 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个10进制数56,将56加56(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:

STEP1:87+78  = 165                  STEP2:165+561 = 726

STEP3:726+627 = 1353                STEP4:1353+3531 = 4884

在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

写一个程序,给定一个N(2<=N<=10N=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”



输入描述:
两行,分别为N,M


输出描述:
STEP=ans
示例1

输入

9
87

输出

STEP=6
def dec_to_m(num, m):
    # 十进制转任意进制
    a = []
    while num != 0:
        temp = num % m
        if temp > 9:
            temp = chr(temp-10 + ord("A"))
        a.append(str(temp))
        num //= m
    return "".join(a)
if __name__ == "__main__":
    m = int(input())
    n = input()
    count = 0
    while True:
        temp = int(n, m) + int(n[::-1], m)
        n = dec_to_m(temp, m)
        count = count + 1
        if count>30:
            print("Impossible!")
            break
        if n == n[::-1]:
            break
    if count <= 30:
        print("STEP=%d" % count)
发表于 2023-06-04 23:31:01 回复(0)
N = int(input())
M = input()
n1 = int(M, N)
n2 = int(M[::-1], N)

def trans_10_N(n):
    # 将十进制转化为N进制,以列表的形式展示
    listn = []
    while n:
        # if n%N != 0:
        listn.append(n%N)
        n = n//N
    listn.reverse()
    return listn

def trans_N_10(n):
    # 将N进制转化为十进制
    lens = len(n)
    m = 0
    for i in range(lens):
        m += N**i *int(n[lens-i-1])
    return m

count = 0
while count <= 30:
    n1 = n1 + n2
    n1 = trans_10_N(n1)
    n2 = list(reversed(n1))
    # print(n1,n2)
    count += 1
    if n1 == n2:
        print(f"STEP={count}")
        break
    n1 = trans_N_10(n1)
    n2 = trans_N_10(n2)
else:
    print("Impossible!")

"""
    思路:
        将n进制转换为10进制 然后相加 相加完之后 将10进制转换为n进制再判断是否回文
        1.无论多少进制相加和 都是转换为10进制相加后的和 值不会变
        2.因为有16进制的存在 所以需要自己手写n进制转换10进制的的dec函数
        3.注意一定要放到列表里面(不要偷懒放到字符串) 因为没法计算的
"""
发表于 2023-04-16 14:29:38 回复(0)
N = int(input().strip())
M = input().strip()
count = 0


def base(m):
    l = 0
    a = 0
    if 2 <= N <= 10:
        m = str(m)
        length = len(m)
        for i in range(length):
            l = int(m[i]) + int(m[length - 1 - i])
            if l >= N:
                x = (l % N) * (10 ** i)
                y = (l // N) * (10 ** (i + 1))
                a += x + y
            else:
                a += l * (10 ** i)
                s = a // (10 ** i)
                h = a % (10 ** i)
                if s >= N:
                    x = (s % N) * (10 ** i)
                    y = (s // N) * (10 ** (i + 1))
                    a = x + y + h

    elif N == 16:
        head = '0X'
        x = head + m
        x_value = eval(x)
        y = head + m[::-1]
        y_value = eval(y)
        int_sum = x_value + y_value
        hex_sum = hex(int_sum)
        a = str(hex_sum).upper().split(head)[1]

    return a


num = base(M)
count += 1
while True:
    if count >= 30:
        print('Impossible!')
        break
    if str(num) == str(num)[::-1]:
        print('STEP=%s' % count)
        break
    else:
        result = base(num)
        count += 1
        num = result
        continue
发表于 2022-09-21 16:46:46 回复(0)

问题信息

难度:
4条回答 4598浏览

热门推荐

通过挑战的用户

查看代码
回文数