1149: 5007 回文数
题目描述
如果一个数从左往右读和从右往左读都是一样的话,那么我们就称它是一个回文数。例如,75457就是一个回文数。
当然,这种性质要取决于这个数是在什么进制下。例如,17在十进制下不是一个回文数,但在二进制下(10001)则是一个回文数。
题目要求你来验证给定的数在2~16进制中的哪些进制下是否是回文数。
输入
输入文件包含了若干个十进制整数n,0 < n < 50000,每个整数占一行。0表示结束。
输出
如果整数i在某些进制下是回文数,则输出“Number i is palindrom in basis”,然后分别输出这些进制,其中i是给定的整数。如果在2~16进制下都不是回文数,则输出“Number i is not palindrom”。
样例输入 复制
17
19
0
样例输出 复制
Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom
#include<iostream>
#include<cstring>
#include<algorithm>
const int N = 100000;
using namespace std;
int base1(int n,int r)
{int a[N];int b[N];int temp = 0;int len = 0;while(n){a[len] = n%r;n/=r;len++;}for(int i = len-1;i>=0;i--)b[len-1-i] = a[i];for(int i = 0;i<len;i++){if(b[i]==a[i])temp++;}if(temp==len)return 1;elsereturn 0;
}
int base2(int n,int r)
{char str[N];char copy[N];int len = 0;int tem = 0;while(n){int mod = n%r;if(mod<10)str[len] = '0'+mod;elsestr[len] = 'A'+mod-10;n/=r;len++;}for(int i = len-1;i>=0;i--)copy[len-1-i] = str[i];for(int i = 0;i<len;i++){if(copy[i]==str[i])tem++;}if(tem==len)return 1;elsereturn 0;
}
int main()
{int n;int count[N];while(scanf("%d",&n)!=EOF){int res = 0;//判断一下条件if(n==0)break;for(int i = 2;i<=10;i++){if(base1(n,i)==1)count[i]=1;}for(int i = 11;i<=16;i++){if(base2(n,i)==1)count[i]=1;}//判断一下能不能用for(int i = 2;i<=16;i++){if(count[i]!=0)res++;}if(res!=0){printf("Number %d is palindrom in basis ",n);for(int i =2;i<=16;i++){if(count[i]!=0)printf("%d ",i);}printf("\\n");}else{printf("Number %d is not a palindrom\\n",n);}memset(count,0,10000);}return 0;
}
题目比较简单容易思考,但我代码量实在是打的太高了,纯纯暴力解法,简单说一下思路吧,我们需要两个进行判断是否是回文数的数组,第一个是我们的在10以内只有数字没有字母,但是当大于10的时候,就会产生字母这时候用char数组,这里用判断回文一个最简单的办法,就是进行反转,用一个数组记录反转的数组,进行计数,如果计数的长度和len相等就是回文串,然后我们用count数组进行一个遍历,只要是回文就改成1,然后就是为了输出的代码,判断下count里有没有1,有一就进行正常输出,没有1的话我们就要进行直接输出不是回文串,所以需要分两种情况进行判断,没思考,纯纯暴力的解法