Description
我们说一个数字如果从左到右和从右到左是一样得就是回文数。例如75457就是一个回文数。当然,这性质还依赖它的进制。17在十进制下不是回文数,不过在二进制下就是回文数了(10001) 。现在就是要一个数在2到16进制下是否回文数。
Input
输入数据由多个整数构成。每个给出的数字 0 < n < 50000各占一行,并且都是以十进制形式给出。输入以零为结束。
Output
你的程序要输出令所给数 I 是回文数的进制。如果这个数在2到16进制里都不是回文数,你的程序就要输出这个数不是回文数的信息。
Sample Input
17
19
0
Sample Output
Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom
这道题很简单只需要一个进制转换函数,加上一个判断回文数的部分就好了
代码
#include<bits/stdc++.h>
using namespace std;
bool binary[17]={};
string ten_to_X(int a,int i)
{
string ans="";
while(a!=0)
{
int p=a%i;
a=a/i;
if(p>9)ans=char(p+'A'-10)+ans;
else ans=to_string(p)+ans;
}
return ans;
}
bool palindrome_number_check(string i)
{
int a,b;
a=0;b=i.size()-1;
while(i[a]==i[b])
{
if(a==b||a+1==b)return 1;
a++;b--;
}
return 0;
}
string check(int a)
{
for(int i=2;i<=16;i++)
{
string xa=ten_to_X(a,i);
if(palindrome_number_check(xa))binary[i]=1;
}
string ans="";
for(int i=2;i<=16;i++)
{
if(binary[i])ans=ans+to_string(i)+" ";
}
return ans;
}
int main()
{
int a;
while(cin>>a&&a!=0)
{
string ca=check(a);
if(ca!="")cout<<"Number "<<a<<" is palindrom in basis "<<ca<<endl;
else cout<<"Number "<<a<<" is not a palindrom"<<endl;
memset(binary,0,17*sizeof(bool));
}
return 0;
}