题目描述
如果一个数从左往右读和从右往左读都是一样的话,那么我们就称它是一个回文数。例如,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;
else
return 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;
else
str[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;
else
return 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的话我们就要进行直接输出不是回文串,所以需要分两种情况进行判断,没思考,纯纯暴力的解法