例5007 回文数
Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)
Total Submissions: 73 Accepted Submissions: 51
Problem Description
如果一个数从左往右读和从右往左读都是一样的话,那么我们就称它是一个回文数。例如,75457就是一个回文数。
当然,这种性质要取决于这个数是在什么进制下。例如,17在十进制下不是一个回文数,但在二进制下(10001)则是一个回文数。
题目要求你来验证给定的数在2~16进制中的哪些进制下是否是回文数。
Input
输入文件包含了若干个十进制整数n,0 < n < 50000,每个整数占一行。0表示结束。
Output
如果整数i在某些进制下是回文数,则输出“Number i is palindrom in basis”,然后分别输出这些进制,其中i是给定的整数。如果在2~16进制下都不是回文数,则输出“Number i is not palindrom”。
Sample Input
17
19
0
Sample Output
Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom
#include <stdio.h>
#include <string.h>
int main()
{
int num;
while(scanf("%d",&num),num)
{
int f1 = 0;
if(num==0) break;
int is[20];
int c[50];
memset(is,0,sizeof(is));
for(int i = 2 ; i<=16 ; i++)
{
int temp = num;
int f2 = 0;
int j = 0;
while(temp)
{
c[j++] = temp%i;
temp /= i;
}
//注意这里的k<j/2。如果数组c长度为5,则j为6,即k<3,可以比较第1,2,4,5位。
//但是如果使k<(j-1)/2,那么就是k<2,只能比较第 1,5位 ,这样会出错
for(int k = 0;k<j/2;k++)
{
if(c[k]!=c[j-1-k])
{
f2 = 1;
break;
}
}
if(!f2)
{
if(!f1) f1 =1;//如果有一个进制下满足回文,就给f1置1(这一步最多执行一次)
is[i]=1;
}
}
if(!f1)
{
printf("Number %d is not a palindrom",num);
}
else
{
printf("Number %d is palindrom in basis",num);
}
for(int i = 2;i<=16;i++)
{
if(is[i])
printf(" %d",i);
}
printf("\n");
}
return 0;
}