帮帮我,题好难,不会

题目描述
一个数字无论从前往后还是从后往前都是一样的,这就是回文数。例如,1234321是回文数。

非回文数可以通过一系列操作与回文数配对。首先,将非回文数反转,并将结果添加到原始数字中。如果结果不是回文数,则重复此操作,直到得到回文数。

例如,从67开始,我们可以分两步得到回文数:67 + 76 = 143 , 143 + 341 = 484。

给定任何正整数N,你应该可以找到它的成对回文数和找到它所花费的步数。

输入描述:
输入包含一个测试用例。每种情况由两个正数N和K组成,其中N (N


1
0
16
10
16
)是初始数,K(K

≤100)是最大步数。这两个数字之间用一个空格隔开。

输出描述:
对于每个测试用例,输出两个数字,每行一个。第一个数字是成对的回文数N,第二个数字是找到回文数所需的步数。

如果K步后没有找到回文数,则只输出第K步得到的数和K。

输入数据 1
67 3
输出数据 1
484
2
输入数据 2
69 3
输出数据 2
1353
3

供参考:

#include <stdio.h>
int fun(int n)  // 逆序一个数
{
    int ret = 0;
    while (n){
        ret = ret * 10 + n % 10;
        n /= 10;
    }
    return ret;
}
int main()
{
    int N, K, k = 0;
    scanf("%d%d", &N, &K);
    while (1) {
        if (N == fun(N))// 判断是否是回文数
            break;
        else{  // 将非回文数反转,并将结果添加到原始数字中
            N += fun(N);
            k++;
        }
        if (k == K)  // 如果K步后没有找到回文数,跳出
            break;
    }
    printf("%d\n%d\n", N, k);// 输出
    return 0;
}

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/201017
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 这里需要对堆有一定的了解,堆就是一个比较特殊的完全二叉树,在最大堆里,每个节点的值都大于其左右两个孩子节点的值。这就是最大堆。反之就是最小堆。拿最大堆举例子,每次堆顶的元素值,不就是当前数列的最大吗?这不就成选择排序里的简单排序了吗?找完之后,将他和完全二叉树里最后一个结点的值进行交换,然后做一个自顶向下的自我调整,将他再次调整成一个完全二叉堆。第二次取最大的树,这时我们需要将上一次找到的结点屏蔽掉,不然会陷入一个死循环。无数次找完之后,再按层序的思想将二叉树里的数据遍历到一个数组当中,这时的数组为一个有序的数组。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 算法思想

  每一步加上自己的倒序数后,都作“回文”判断,如果回文数,则返回回文数和次数。

  用10取余获个位数字,连续整除10,得到其它数位数字。


  • Python 代码
#!/sur/bin/nve python
# coding: utf-8


def reverse(num):
    ''' 反转整数 '''
    result = 0
    
    while 1:

        if not num:
            return result # 

        result = result*10 + num%10
        num //= 10 # 整数整除10。

def is_palindromic(num, k):
    ''' 回文数判定 '''
    
    for i in range(k): # 遍历轮询k次。
        num += reverse(num)
        
        if num == reverse(num):
            return num, i+1

    return num, i+1


if __name__ == '__main__':
    num, k = 110967, 5
    print(f"\n输入参数:\n{num}, {k}\n\n输出:")
    print(*is_palindromic(num, k))

  • 返转函数也可以用列表写——

def reverse(num): # 返转函数也可以用列表写。
    ''' 反转整数 '''
    result = []
    
    while 1:

        if not num:
            break  

        result.insert(len(result), num%10) # 在列表末尾插入当前数位数字。
        num //= 10 # 整数整除10。

    k = len(result)-1 # 数位指数初值。num已是0,不用重赋初值。
    for i in result[:]:
        num += i*10**k
        k -= 1

    return num # 返回反转后的整数。


  • 用字符串切片反转string[::-1]和vael()转换字符串为python 表达式,还可以把上面那段代码写得更优雅。😁
def is_palindromic(num, k):
    ''' 回文数判定 '''
    
    for i in range(k): # 遍历轮询k次。
        num += eval(str(num)[::-1]) # 字符串切片反转整数。
        
        if str(num) == str(num)[::-1]:
            return num, i+1

    return num, i+1


if __name__ == '__main__':
    print(*is_palindromic(97, 13))

  • 代码运行效果截屏图片

    img