题目描述
我们把从左往右和从右往左念起来相同的数字叫做回文数。例如,75457就是一个回文数。
当然某个数用某个进制表示不是回文数,但是用别的进制表示可能就是回文数。
例如,17是用十进制表示的数,显然它不是一个回文数,但是将17用二进制表示出来是10001,显然在二进制下它是一个回文数。
现在给你一个用十进制表示的数,请你判断它在2~16进制下是否是回文数。
输入
输入包含多组测试数据。每组输入一个用十进制表示的正整数n(0<n<50000),当n=0时,输入结束。
输出
对于每组输入,如果n在2~16进制中的某些进制表示下是回文数,则输出“Number i is palindrom in basis ”,在后面接着输出那些进制。其中i用n的值代替,后面输出的进制中,每两个数字之间空一个。
如果n在2~16进制的表示下都不为回文数,则输出“Number i is not a palindrom”,其中i用n的值代替。
样例输入
17
19
0
样例输出
Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
const int radix[17]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
using namespace std;
-----------------------------------------
进制转换**输出反转
string intToA(int n,int radix)
{
string ans="";
do{
int t=n%radix;
if(t>=0&&t<=9)
ans+=t+'0';
else
ans+=t-10+'a';
n/=radix;
}while(n!=0);
reverse(ans.begin(),ans.end());//**反转输出**//
return ans;
}
----------------------------------------
--------------------------------------
判断回文数 感觉我写的太笨了,耗时会很长
最好使用栈来判断
bool ifcir(int p,string ans)
{
int len=p;
int pos;
if(p%2==0)
pos=p/2;
else
pos=p/2+1;
for(int i=0;i<=pos;i++)
{
if(ans[i]!=ans[--len])
return false;
}
}
--------------------------------------
使用栈来判断回文数
//**啊,这是一个假的栈**//
//**啊,其实用起来一样**//
#include <stdio.h>
#include <stdlib.h>
typedef struct Stack
{
int top;
char str[100];
}STACK;
int main()
{
int len,i,mid,next;
char str[100];
STACK s;
s.top=0;
gets(str);//获取字符串
len=strlen(str);
mid=len/2;
for(i=0;i<mid;i++)
{
s.str[s.top]=str[i];
s.top++;
}//将字符串**的一半***拆分入栈
if(len%2!=0)
{
next=mid+1;
}
else
{
next=mid;
}//next标记中间左1\右1
while(s.top!=0)//s.top标记字符数量的一半
{
if(s.str[s.top-1]==str[next])//s.pop()==str[next]\s.gettop()==str[next]
{
s.top--;//mid向左推
next++;//mid向右推
}
else
{
break;
}
}
if(s.top==0)
{
printf("是回文\n");
}
else
{
printf("不是回文\n");
}
return 0;
}
--------------------------------------
int main()
{
int n;
cin>>n;
while(n!=0)
{
int p,i;
string ans;
//string dix="";
int solve[16];
int s=0;
for(int j=2;j<=16;j++)
{
ans="";
i=0;
p=0;
ans=intToA(n,radix[j]);
while(ans[i]!='\0')
{
p++;
i++;
}
if(ifcir(p,ans))
{
s++;
solve[s]=j;
}
}
if(s)
{
cout<<"Number "<<n<<" is palindrom in basis";
for(int m=1;m<=s;m++)
{
cout<<" "<<solve[m];
}
cout<<endl;
}
if(!s)
cout<<"Number "<<n<<" is not a palindrom"<<endl;
cin>>n;
}
return 0;
}