题目描述:
如果一个数字从左边读和从右边读一样,那么这个数字就是一个回文数。例如32123就是一个回文数;17在某种意义上也是一个回文数,因为它的二进制型式——10001——是一个回文数。
请你帮忙开发一个程序,判断一个数n在任意进制(2-16)下是否有回文数。
输入描述:
输入包含多组数据。
每组数据包括一个正整数n (1≤n<2^31)。
输出描述:
对应每组数据,如果n在2-16进制下存在回文数,则输出“Yes”;否则输出“No”。
输入例子:
32123
17
输出例子:
Yes
Yes
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
string fun(ll m,int n){//进制转换
string res;
ll t;
while(m!=0){
t = m%n;
m = m/n;
if(t<10) res+=(t+'0');
else res+=(t-10+'A');
}
reverse(res.begin(),res.end());
return res;
}
bool check(string s){ //判断是否是回文数
if(s.size()<=1) return true;
for(int i=0;i<s.size()/2;i++){
if(s[i]!=s[s.size()-i-1])
return false;
}
return true;
}
void judge(int n){ //每个进制都check一次
bool flag=false;
for(int i=2;i<=16;i++){
if((flag=check(fun(n,i)))==true)
break;
}
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
int main(){
ll m;
while(cin>>m){
judge(m);
}
return 0;
}