洛谷-P1015 [NOIP1999 普及组] 回文数

洛谷-P1015 [NOIP1999 普及组] 回文数

原题链接:https://www.luogu.com.cn/problem/P1015


题目描述

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个十进制数 \(56\),将 \(56\)\(65\)(即把 \(56\) 从右向左读),得到 \(121\) 是一个回文数。

又如:对于十进制数 \(87\)

STEP1:\(87+78=165\)
STEP2:\(165+561=726\)
STEP3:\(726+627=1353\)
STEP4:\(1353+3531=4884\)

在这里的一步是指进行了一次 \(N\) 进制的加法,上例最少用了 \(4\) 步得到回文数 \(4884\)

写一个程序,给定一个 \(N\)\(2 \le N \le 10\)\(N=16\))进制数 \(M\)\(100\) 位之内),求最少经过几步可以得到回文数。如果在 \(30\) 步以内(包含 \(30\) 步)不可能得到回文数,则输出 Impossible!

输入格式

两行,分别是 \(N\)\(M\)

输出格式

如果能在 \(30\) 步以内得到回文数,输出格式形如 STEP=ans,其中 \(ans\) 为最少得到回文数的步数。

否则输出 Impossible!

输入输出样例

输入 #1

10
87

输出 #1

STEP=4

C++代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int n;

string add(string a) {
    string b = a;
    reverse(b.begin(), b.end());
    int x, y, t = 0, len = a.size();
    for (int i=len-1; i>=0; --i) {
        x = (a[i]>='A')?(a[i]-'A'+10):(a[i]-'0');
        y = (b[i]>='A')?(b[i]-'A'+10):(b[i]-'0');
        x += y + t;
        t = (x>=n)?1:0;
        if (t == 1)
            x -= n;
        a[i] = (x>9)?(x-10+'A'):(x+'0');
    }
    if (t == 1)
        a = "1" + a;
    return a;
}

bool isPalindrome(string a) {
    string b = a;
    reverse(b.begin(), b.end());
    return a == b;
}

int main() {
    int i;
    string m;
    cin >> n >> m;
    for (i=0; i<=30&&!isPalindrome(m); ++i)
        m = add(m);
    if (i > 30)
        cout << "Impossible!" << endl;
    else
        cout << "STEP=" << i << endl;
    return 0;
}
posted @ 2021-02-18 09:57  yuzec  阅读(878)  评论(0编辑  收藏  举报