思路:创建一个char数组接收数字,之后循环先判断是否为回文数,然后反序相加。我的add函数处理反序相加,创建另一个char数组存放反序的数字,之后就是两个数组相加进位的事了。(我的add函数可以反序相加处理1-16进制的数,16以上也可以)(很花心思,球球点个赞QAQ)

如有不对也请多加指正。

#include <stdio.h>
int pld(char M[], int* l) {//判断回文数
    int left = 0;
    int right = *l;
    for (; left < right; left++, right--) {
        if (M[left] != M[right])
            return 1;
    }
    return 0;
}
void add(char M[], int* l, int n) {//对数字进行处理(反序相加,1-16进制皆可)
    int i = 0;
    int j = *l;
    int sum = 0;
    char M1[100];
    for (i = 0; i <= *l; i++, j--)//创建新数组保存反序后的数
        M1[i] = M[j];
    for (i = 0; i <= *l; i++) {//处理十进制以上的数
        if (M[i] > 57)
            M[i] -= 7;
        if (M1[i] > 57)
            M1[i] -= 7;
    }
    for (i = 0; i <= *l; i++) {
        sum = M[i] + M1[i] - 96;
        M[i] = (sum % n + 48);//两个数相加取模n进制
        if (i == *l) {//判断如果两个数的首尾相加有进位,l就加一(l记录这个数有几位数)
            if ((sum / n) != 0) {
                M[i + 1] = (sum / n + 48);
                (*l)++;
            }
            break;
        }
        M[i + 1] = (sum / n + 48) + M[i + 1] - 48;//两个数相加的进位加到前一位去(没有进位就是加0)
    }
    for (i = 0; i <= *l; i++) {//处理十进制以上的数
        if (M[i] > 57)
            M[i] += 7;
    }
}
int main() {
    int n = 0;
    int l = 0;
    int step = 0;
    char M[100];
    scanf("%d", &n);
    getchar();
    int i = 0;
    do {
        M[i] = getchar();//将数字读入数组里
        i++;
    } while (M[i - 1] != '\n');
    i -= 2;
    l = i;//l是记录这个数有几位数
    int left = 0;
    int right = l;
    do {//将数组里数字反序(这里是方便后面进位才反序的,实际的反序相加处理在后面的函数里)
        int tmp = 0;
        tmp = M[left];
        M[left] = M[right];
        M[right] = tmp;
    } while (left++ < right--);
    while (pld(M, &l)) {//如果不是回文数就继续反序相加处理
        add(M, &l, n);
        step++;
        if (step > 30)//处理步数大于30就跳出循环
            break;
    }
    if (step <= 30)
        printf("STEP=%d", step);
    else
        printf("Impossible!");
    return 0;
}