PAT乙级(Basic Level)练习题 进制回文数

题目描述
如果一个数字从左边读和从右边读一样,那么这个数字就是一个回文数。例如32123就是一个回文数;17在某种意义上也是一个回文数,因为它的二进制型式——10001——是一个回文数。
请你帮忙开发一个程序,判断一个数n在任意进制(2-16)下是否有回文数。

输入描述:
输入包含多组数据。
每组数据包括一个正整数n (1≤n<2^31)。

输出描述:
对应每组数据,如果n在2-16进制下存在回文数,则输出“Yes”;否则输出“No”。

输入例子:

32123
17

输出例子:

Yes
Yes

\color{blue}解题思路:
还是水题一道。。。
分别将n转换r进制r∈[2,16],如果有一个是回文,则输出Yes,否则输出No

\color{blue}代码实现:

#include <iostream>
#include <string>
using namespace std;

// 将数字n转化为r进制(字符串格式)
string getR(int n, int r) {
    string resStr = "";
    while (n != 0) {
        char ch = n % r;
        //转换为响应的数字字符,超过10需要转成A、B、C等大写字母
        if (ch > 9) {
            ch += 'A' - 10;
        } else {
            ch += '0';
        }
        //逆序拼接,因为我们是从低到高位进行转换
        resStr = ch + resStr;
        n /= r;
    }
    return resStr;
}

//判断字符串是否为回文
bool isPalindrome(string str) {
    int length = (int)str.length();
    for (int i = 0; i < length / 2; ++i) {
        //从左往中间对称比较
        if (str[i] != str[length - i - 1]) {
            return false;
        }
    }
    return true;
}

int main(int argc, const char * argv[]) {
    int n = 0;
    //scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
    while (scanf("%d", &n) != - 1) {
        bool flag = false;
        for (int r = 2; r < 17; ++r) {
            //如果n转换为r进制后是回文
            if (isPalindrome(getR(n, r))) {
                flag = true;
                break;
            }
        }
        printf("%s\n", (flag ? "Yes" : "No"));
    }
    return 0;
}

在这里插入图片描述

发布了1005 篇原创文章 · 获赞 269 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/104661087
今日推荐