1067 - 回文数

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

我们把从左往右和从右往左念起来相同的数字叫做回文数。例如,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

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);
 }
}

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;
}

Java解答


import java.awt.List;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	public static boolean isPalindrom(String str){
		int i=0,j=str.length()-1;
		while (i<j){
			if (str.charAt(i)!=str.charAt(j)) {
				return false;
			}
			i++;j--;
		}
		return true;
	}
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		while (cin.hasNext()){
			int n=cin.nextInt();
			if (n==0) {
				break;
			}
			boolean first=true,flag=true;
			for (int i = 2; i < 17; i++) {
				String str=Integer.toString(n, i);
				if (isPalindrom(str)) {
					flag=false;
					if (first) {
						first=!first;
						System.out.print("Number ");System.out.print(n);System.out.print(" is palindrom in basis ");
						System.out.print(i);
					}else {
						System.out.print(" ");System.out.print(i);
					}
				}
			}
			if (flag) {
				System.out.print("Number ");System.out.print(n);System.out.print(" is not a palindrom");
			}
			System.out.println();
			
		}
	}

}

Python解答

import string
def baseconvert(n, base):
  digits = string.digits + string.ascii_lowercase
  res = ""
  while n:
    n, mod = divmod(n, base)
    res += digits[mod]
  return res
def judge(s):
  return s == s[::-1]
while True:
  n = input()
  if n == 0:
    break
  ans = []
  for i in xrange(2,17):
    if judge(baseconvert(n,i)):
      ans.append(str(i))
  if ans:
    print "Number %d is palindrom in basis %s" %(n, ' '.join(ans))
  else:
    print "Number %d is not a palindrom" %(n)