游客 Signup | Login
中文 | En

1067 - 回文数

我们把从左往右和从右往左念起来相同的数字叫做回文数。例如,75457就是一个回文数。
当然某个数用某个进制表示不是回文数,但是用别的进制表示可能就是回文数。
例如,17是用十进制表示的数,显然它不是一个回文数,但是将17用二进制表示出来是10001,显然在二进制下它是一个回文数。
现在给你一个用十进制表示的数,请你判断它在2~16进制下是否是回文数。

Input

输入包含多组测试数据。每组输入一个用十进制表示的正整数n(0<n<50000),当n=0时,输入结束。

Output

对于每组输入,如果n在2~16进制中的某些进制表示下是回文数,则输出“Number i is palindrom in basis ”,在后面接着输出那些进制。其中i用n的值代替,后面输出的进制中,每两个数字之间空一个。
如果n在2~16进制的表示下都不为回文数,则输出“Number i is not a palindrom”,其中i用n的值代替。

Examples

Input

17
19
0

Output

Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom

Solution C

#include<stdio.h>
int transfer(int m,int change)
{ 
  int a[100],j,length,low,high,key,saveM=m;
  for(j=0;m!=0;j++)
  {
    a[j]=m%change;
    m=m/change;
   }
  length=j-1;
  if(change>10)
  for(j=length;j>=0;j--)
  {
	if(a[j]==10)
		a[j]='A';
	if(a[j]==11)
		a[j]='B';
	if(a[j]==12)
		a[j]='C';
	if(a[j]==13)
		a[j]='D';
	if(a[j]==14)
		a[j]='E';
	if(a[j]==15)
		a[j]='F';
  }
  low=0;
  high=length;
  key=0;
  while(low<=high)
  {
    if(a[low]!=a[high])
		key=1;
	low++;high--;
  }
  if(key==0)
	  return change;
  else
	  return 0;


}
void main()
{
 int n,c,key1,k,b[100],i,temp;
 scanf("%d",&n);
 while(n!=0)
 {
   key1=k=0;
   for(c=2;c<=16;c++)
   {
	   temp=transfer(n,c);
    	if(temp!=0)
		{
			key1=1;
			b[k]=temp;
			k++;
		}
    }
   if(key1==0)
     printf("Number %d is not a palindrom",n);
   else
   {
	   printf("Number %d is palindrom in basis",n);
	   for(i=0;i<k;i++)
		   printf(" %d",b[i]);
   }
   printf("\n");
   scanf("%d",&n);
 }
}

Solution C++

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

char result[1000];

void base_convert(char num[],int s,int e)
{
	int i,flag,k,j,a[1000],b[1000];
	for(i=0;i<strlen(num);i++)
	{
		if(num[i]>='A'&&num[i]<='Z')
			a[i]=num[i]-55;
		else if(num[i]>='a'&&num[i]<='z')
			a[i]=num[i]-61;
		else
			a[i]=num[i]-48;
	}
	k=0;
	while(1)
	{
		for(i=0;i<strlen(num);i++)
		{
			if(a[i]!=0&&i<strlen(num)-1)
			{
				a[i+1]+=(a[i]%e)*s;
				a[i]/=e;
			}
			if(i==strlen(num)-1)
			{
				b[k++]=a[i]%e;
				a[i]/=e;
			}
		}
		flag=0;
		for(i=0;i<strlen(num);i++)
			if(a[i]!=0)
				flag=1;
		if(!flag)
			break;
	}
	for(j=0,i=k-1;i>=0;i--)
	{
		if(b[i]>=10&&b[i]<=35)
			result[j++]=b[i]+55;
		else if(b[i]>=36&&b[i]<=61)
			result[j++]=b[i]+61;
		else
			result[j++]=b[i]+48;
	}
	result[j]='\0';
}

int main()
{
	char s[1000],t[1000];
	int i,flag,v[17];
	while(scanf("%s",s)!=EOF,s[0]!='0')
	{
		memset(v,0,sizeof(v));
		for(flag=0,i=2;i<=16;i++)
		{
			if(i!=10)
				base_convert(s,10,i);
			else
				strcpy(result,s);
			strcpy(t,result);
			reverse(result,result+strlen(result));
			if(!strcmp(t,result))
			{
				flag=1;
				v[i]=1;
			}
		}
		if(flag)
		{
			printf("Number %s is palindrom in basis",s);
			for(i=2;i<=16;i++)
				if(v[i])
					printf(" %d",i);
			puts("");
		}
		else
			printf("Number %s is not a palindrom\n",s);
	}
	return 0;
}
Time Limit 1 second
Memory Limit 32 MB
Discuss Stats
上一题 下一题