题目描述
如果一个数字从左边读和从右边读一样,那么这个数字就是一个回文数。例如32123就是一个回文数;17在某种意义上也是一个回文数,因为它的二进制型式——10001——是一个回文数。
请你帮忙开发一个程序,判断一个数n在任意进制(2-16)下是否有回文数。
输入描述:
输入包含多组数据。
每组数据包括一个正整数n (1≤n<2^31)。
输出描述:
对应每组数据,如果n在2-16进制下存在回文数,则输出“Yes”;否则输出“No”。
输入例子:
32123
17
输出例子:
Yes
Yes
还是水题一道。。。
分别将n
转换r
进制r∈[2,16]
,如果有一个是回文,则输出Yes
,否则输出No
。
#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;
}