用字符串进行处理

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

bool judge(const char M[], int len)//判断 M 中的值是否为回文数
{
    int i = 0;
    for (i = 0; i < len / 2; i++)
    {
        if (M[i] != M[len - 1 - i])
        {
            return false;
        }
    }
    return true;
}

void step(int N, char M[], int len)
{
    int i = 0;//计数器
    int quot = 0;//商值
    int n = 0;//头尾一对数的和
    char m[100] = { '\0' };//倒着存放总和

    // N 进制的加法运算
    for (i = 0; i < len; i++)
    {
        //从头开始
        if (M[i] > '9')//值为 10 或 10 以上的情况
        {
            n = M[i] - 'A' + 10;
        }
        else//值为:0 ~ 9 的情况
        {
            n = M[i] - '0';
        }

        //从末尾开始
        if (M[len - 1 - i] > '9')//值为 10 或 10 以上的情况
        {
            n += M[len - 1 - i] - 'A' + 10;
        }
        else//值为:0 ~ 9 的情况
        {
            n += M[len - 1 - i] - '0';
        }

        if (1 == quot)//商为 1 时,进一位
        {
            n++;
        }

        quot = n / N;//求商

        n %= N;//求应储存在 m 中的值

        if (n > 9)//值为 10 或 10 以上的情况
        {
            m[i] = n - 10 + 'A';
        }
        else//值为:0 ~ 9 的情况
        {
            m[i] = n + '0';
        }
    }
    
    //若最后一次加法运算后要进一位,则在这里进行处理
    if (1 == quot)
    {
        m[len] = '1';//进一位
        len++;//扩展 m 的长度
    }

    //逆着存 m 的值到 M 中,使最后 M 中的值是正序的
    //方便在 judge 函数中判断回文数
    for (i = 0; i < len; i++)
    {
        M[i] = m[len - 1 - i];
    }
}

int main()
{
    int N = 0;//进制
    char M[100] = { '\0' };//数
    scanf("%d %s", &N, M);//数据输入
    int i = 0;//计数器

    //数据处理
    //循环 30 次, 即30 步
    for (i = 0; i < 30; i++)//若最后一次循环的值仍不是回文数,i = 29 + 1 = 30
    {
        step(N, M, strlen(M));
        if (judge(M, strlen(M)))
        {
            break;
        }
    }

    //数据输出
    if (i < 30)//在30步以内得到回文数的情况
    {
        printf("STEP=%d\n", i + 1);
    }
    else//在30步以内未得到回文数的情况
    {
        printf("Impossible!\n");
    }
    return 0;
}