1067 - 回文数
时间限制 : 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)