1 条题解

  • 4
    @ 2026-1-12 9:35:49
    #include <bits/stdc++.h>   
    
    using namespace std;
    
    // ====================
    // 字符与数值转换函数
    // ====================
    
    // 将字符 c 转换为对应的整数值
    // '0'~'9' -> 0~9
    // 'A'~'F' -> 10~15
    int charToInt(char c) {
        if (c >= '0' && c <= '9') return c - '0';  // 数字字符直接减 '0'
        return c - 'A' + 10;                       // 大写字母转换为 10~15
    }
    
    // 将数值 x 转换为对应的字符
    // 0~9 -> '0'~'9'
    // 10~15 -> 'A'~'F'
    char intToChar(int x) {
        if (x < 10) return x + '0';               // 小于 10 用数字字符表示
        return x - 10 + 'A';                       // 大于等于 10 用大写字母表示
    }
    
    // ====================
    // 判断回文函数
    // ====================
    bool isPalindrome(const string &s) {
        int l = 0;                  // 左指针,从字符串开头
        int r = s.length() - 1;     // 右指针,从字符串末尾
    
        while (l < r) {             // 当左指针小于右指针时继续检查
            if (s[l] != s[r])       // 两端字符不相等,不是回文
                return false;
            l++;                     // 左指针向右移动
            r--;                     // 右指针向左移动
        }
        return true;                 // 所有对应字符都相等,是回文
    }
    
    // ====================
    // N 进制高精度加法函数
    // ====================
    string add(string a, string b, int N) {
        int lena = a.length();                     // a 的长度
        int lenb = b.length();                     // b 的长度
        int maxLen = max(lena, lenb) + 1;         // 结果最多比最大长度多 1 位
    
        string res(maxLen, '0');                  // 创建结果字符串,初始全为 '0'
                                                   // 用下标从后往前填结果
    
        int i = lena - 1;                          // 指向 a 的末位(最低位)
        int j = lenb - 1;                          // 指向 b 的末位(最低位)
        int k = maxLen - 1;                        // 指向 res 的末位(最低位)
        int carry = 0;                              // 进位初始化为 0
    
        // 竖式加法,从最低位开始逐位计算
        while (i >= 0 || j >= 0) {
            int x = 0, y = 0;
    
            if (i >= 0) { x = charToInt(a[i]); i--; }  // a 当前位的值
            if (j >= 0) { y = charToInt(b[j]); j--; }  // b 当前位的值
    
            int sum = x + y + carry;                    // 当前位相加 + 进位
            res[k] = intToChar(sum % N);               // 当前位存结果,按 N 进制取模
            carry = sum / N;                           // 计算进位,整除 N
            k--;                                       // 指向 res 的下一位(左移)
        }
    
        // 处理最后的进位,如果还有进位就放到最高位
        if (carry != 0) 
            res[k] = intToChar(carry);  // 进位存到最高位
        else 
            k++;                        // 没有进位,最前面多余的 '0' 跳过
    
        return res.substr(k);            // 返回有效部分
    }
    
    // ====================
    // 主函数
    // ====================
    int main() {
        int N;           // 进制
        string M;        // 输入数字(N 进制表示)
        cin >> N >> M;   // 从标准输入读取
    
        // 最多 30 步
        for (int step = 0; step <= 30; step++) {
    
            // 第 0 步也要判断是否已经是回文
            if (isPalindrome(M)) {
                cout << step << endl;   // 输出步数
                return 0;               // 程序结束
            }
    
            // 超过 30 步仍然没有回文,结束循环
            if (step == 30) break;
    
            // 手动生成 M 的反转字符串
            int len = M.length();
            string rev(len, '0');       // 创建长度为 len 的字符串
            for (int i = 0; i < len; i++) {
                rev[i] = M[len - 1 - i]; // 逐位倒置
            }
    
            // 将原数与反转数相加(高精度 N 进制)
            M = add(M, rev, N);
        }
    
        // 30 步内无法得到回文数
        cout << "Impossible" << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    383
    提交时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    43
    已通过
    9
    上传者