CSP歷年複賽題-P1015 [NOIP1999 普及組] 迴文數

江城伍月發表於2024-05-20

原題連結:https://www.luogu.com.cn/problem/P1015

題意解讀:一個N進位制數M,把M正序和M逆序相加,幾次之後得到是數是迴文數,如果超過30次還無法得到迴文數,輸出Impossible!。

解題思路:

M最長100位,因此需要高精度,定義陣列vector<int> m來儲存整數M

注意:16進位制中可能存在'a~f''A~F'等字母,需要轉換成相應的整數

接下來重複以下過程:

將m正序、逆序對應整數進行相加,對結果是否迴文進行判定,如果是迴文則輸出步數

如果重複30次還無法得到迴文,輸出Impossible!

100分程式碼:

#include <bits/stdc++.h>
using namespace std;

int n;
string s;
vector<int> m;

int main()
{
    cin >> n >> s;
    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] >= '0' && s[i] <= '9')
            m.push_back(s[i] - '0');
        if(s[i] >= 'a' && s[i] <= 'f')
            m.push_back((s[i] - 'a' + 10));
        if(s[i] >= 'A' && s[i] <= 'F')
            m.push_back(s[i] - 'A' + 10);
    }

    //對m正序和逆序做高精度加法,30步以內
    for(int step = 1; step <= 30; step++)
    {
        vector<int> res;
        int r = 0; //進位
        for(int i = 0; i < m.size(); i++)
        {
            r += m[i] + m[m.size() - 1 - i];
            res.push_back(r % n);
            r /= n;
        }
        if(r) res.push_back(r);

        //判斷res是否是迴文數
        bool ishw = true;
        for(int i = 0; i < res.size(); i++)
        {
            if(res[i] != res[res.size() - 1 - i])
            {
                ishw = false;
                break;
            }
        }
        if(ishw) 
        {
            cout << "STEP=" << step;
            return 0;
        }
        m = res;
    }
    cout << "Impossible!";
    return 0;
}

相關文章