1 条题解

  • 0
    @ 2025-4-4 9:09:27
    #include <bits/stdc++.h>
    using namespace std;
    const int LEN = 300 + 30;
    int N; // 进制数
    string M;
    int step;
    
    int mLen;
    int m[LEN + 5];
    
    // 检查 m[0]~m[mLen-1] 是否回文
    bool check()
    {
        for (int i = 0, j = mLen - 1; i < j; i++, j--)
            if (m[i] != m[j])
                return false;
        return true;
    }
    
    int main()
    {
        cin >> N;
        cin >> M;
    
        // M 翻转并转换为对应的数字
        mLen = M.size();
        for (int i = 0; i < mLen; i++)
        {
            if ('0' <= M[i] && M[i] <= '9')
                m[mLen - i - 1] = M[i] - '0';
            if ('A' <= M[i] && M[i] <= 'F')
                m[mLen - i - 1] = M[i] - 'A' + 10;
        }
    
        // 循环执行直到回文或者 30 步为止
        for (step = 0; step < 30 && !check(); step++)
        {
            // 颠倒相加
            for (int i = 0, j = mLen - 1; i <= j; i++, j--)
            {
                int now = m[i] + m[j];
                m[i] = m[j] = now;
            }
            // 进位
            for (int j = 0; j < mLen - 1; j++)
            {
                m[j + 1] += m[j] / N;
                m[j] %= N;
            }
            // 最高位尝试扩展
            while (m[mLen - 1] > N - 1)
            {
                m[mLen] = m[mLen - 1] / N;
                m[mLen - 1] %= N;
                mLen++;
            }
        }
    
        // 输出
        if (step >= 30)
            cout << "Impossible!";
        else
            cout << "STEP=" << step;
        return 0;
    }
    
    • 1

    信息

    ID
    13416
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者