7-2 进制回文数
如果一个数从左边读和从右边读是相同的,我们就说这是一个回文数,比如15851。当然,数的这个特性,还依赖于它的进制。比如,十进制数17,不是一个回文数,但是当把它化成二进制后,就是10001,它就是回文数了。 现在,请你判定一个给定的数,在二进制到十六进制下,是哪种进制的回文数。
输入格式:
输入是一些整数。每个数n(0<n<50000)占一行,用十进制表示。输入0时结束测试。
输出格式:
输出信息为"Number x is palindrom in basis …"。其中x是给定的数,…表示它是对应进制下的回文数。如果这个数x在二进制到十六进制下都不是回文数,就输出信息"Number x is not palindrom"。
输入样例:
17
19
0
输出样例:
Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom
解题思路:
这道题有一点小坑,按照常理来说,2-16进制之间无非就是二进制、四进制、八进制、十进制和十六进制,但是本题需要考虑每个数字的2-16进制中的每一个进制,这其中就肯定有三进制、六进制、十一进制等大家考虑不到的地方
第二个就是进制转换时 ’ cstdio ’ 中的_itoa函数无法在PTA中使用,也就是说进制转换功能需要我们自己来写
当然进制转换的设计思路就是除进制数再取余,2-16进制那么多,我们肯定不会每种进制都写一个单独的代码,这里用循环来实现,循环时需要将转换代码分成两种,一种是十进制以内的,他们在转换过程中不会出现字母,另一种就是11-16进制,他们的转换过程中会出现字母
十进制以内转换函数
bool one_to_ten(int num, int radix)
{
char radix_num[17] = { '\0' };
int radix_num_count = 0;
while (num != 0)
{
int temp = num % radix;
radix_num[radix_num_count] = temp + 48;
num /= radix;
radix_num_count++;
}
for (int i = 0, j = strlen(radix_num) - 1; i < j; i++, j--)
{
if (radix_num[i] != radix_num[j])
{
return false;
}
}
return true;
}
11-16进制转换函数
bool eleven_to_sixteen(int num, int radix)
{
char radix_num[17] = { '\0' };
int radix_num_count = 0;
while (num != 0)
{
int temp = num % radix;
if (temp >= 0 && temp <= 9)
{
radix_num[radix_num_count] = temp + 48;
}
else
{
radix_num[radix_num_count] = temp + 55;
}
num /= radix;
radix_num_count++;
}
for (int i = 0, j = strlen(radix_num) - 1; i < j; i++, j--)
{
if (radix_num[i] != radix_num[j])
{
return false;
}
}
return true;
}
参考代码:
#include<iostream>
#include<cstring>
using namespace std;
bool one_to_ten(int num, int radix)
{
char radix_num[17] = { '\0' };
int radix_num_count = 0;
while (num != 0)
{
int temp = num % radix;
radix_num[radix_num_count] = temp + 48;
num /= radix;
radix_num_count++;
}
for (int i = 0, j = strlen(radix_num) - 1; i < j; i++, j--)
{
if (radix_num[i] != radix_num[j])
{
return false;
}
}
return true;
}
bool eleven_to_sixteen(int num, int radix)
{
char radix_num[17] = { '\0' };
int radix_num_count = 0;
while (num != 0)
{
int temp = num % radix;
if (temp >= 0 && temp <= 9)
{
radix_num[radix_num_count] = temp + 48;
}
else
{
radix_num[radix_num_count] = temp + 55;
}
num /= radix;
radix_num_count++;
}
for (int i = 0, j = strlen(radix_num) - 1; i < j; i++, j--)
{
if (radix_num[i] != radix_num[j])
{
return false;
}
}
return true;
}
void judge()
{
int radix[100][16] = { 0 }, radix_count[100][1] = { 0 };
int input[100] = { 0 };
int group=0;
while (cin >> input[group])
{
if (input[group]==0)
{
break;
}
int i = 0;
for(int n=2;n<=16;n++)
{
if(n<11)
{
if (one_to_ten(input[group], n))
{
radix[group][i] = n;
radix_count[group][0]++;
i++;
}
}
else
{
if (eleven_to_sixteen(input[group], n))
{
radix[group][i] = n;
radix_count[group][0]++;
i++;
}
}
}
group++;
}
for (int i=0;i<group;i++)
{
if (radix_count[i][0]==0)
{
cout << "Number " << input[i] << " is not a palindrom" << endl;
}
else
{
cout << "Number " << input[i] << " is palindrom in basis ";
for (int j = 0; j < radix_count[i][0];j++)
{
if (j!= radix_count[i][0] - 1)
{
cout << radix[i][j] << " ";
}
else
{
cout << radix[i][j] << endl;
}
}
}
}
}
int main()
{
judge();
return 0;
}
原创不易,点个关注~~