洛谷-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;
}
原文地址:https://www.cnblogs.com/yuzec/p/14410677.html