网站哪家做得好/百度网页入口
例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;
}