若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
STEP1:87+78 ?= 165 ?????????????????STEP2:165+561 = 726
STEP3:726+627 = 1353 ???????????????STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<=N<=10或N=16)进制数M(100位之内),求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
进制N>10时,使用大写'A'字母表示10,'B'表示11,...,'E'表示15
两行,分别为N,M
STEP=ans
输入:
9 87
输出:
STEP=6
这段代码的主要思路是通过循环迭代来判断一个数是否是回文数。具体的步骤如下:
n
?和一个字符数组?crr
。func_crr_to_arr
?将字符数组转换为整数数组?arr
,并统计数组的长度。arr
?是否是回文数(即正序和逆序相同)。
func_get_arr_reserve
?获取?arr
?的逆序存储在?arr_r
?中。func_arr_reset
?对?arr
?进行处理,使其加上逆序后仍然满足进制要求。step
?记录,并在每次循环后递增。step
?的值输出结果。总的来说,该代码通过迭代判断和处理整数数组,直到得到回文数或超过30步为止。这种方法可以用于解决回文数问题。
#include <stdio.h>
int n;
int arr[20] = {0}, arr_r[20] = {0};
char crr[10] = {0};
int lenght = 0;
// 将字符数组转换为整数数组
void func_crr_to_arr()
{
for(lenght = 1; crr[lenght-1] != 0 ; lenght++)
{
if(crr[lenght-1] >= '0' && crr[lenght-1] <= '9') arr[lenght] = crr[lenght-1] - '0';
else if(crr[lenght-1] >= 'A' && crr[lenght-1] <= 'F') arr[lenght] = crr[lenght-1] - 'A' + 10;
}
lenght -= 1;
}
// 判断整数数组是否是回文数
int func_arr_palindrome_judge()
{
for(int i = 1; i <= lenght ; i++)
{
if(arr[i] != arr[lenght - i + 1])
return 0;
}
return 1;
}
// 获取整数数组的逆序
void func_get_arr_reserve()
{
for(int i = 1; i <= lenght ; i++)
{
arr_r[i] = arr[lenght - i + 1];
}
}
// 对整数数组进行处理,使其加上逆序后仍然满足进制要求
void func_arr_reset()
{
for(int i = lenght; i > 0; i--)
{
if((arr[i] + arr_r[i]) / n != 0 )
{
arr[i - 1] ++;
arr[i] = arr[i] + arr_r[i] - n;
}
else
{
arr[i] = arr[i] + arr_r[i];
}
}
if(arr[0] != 0)
{
for(int i = lenght; i >= 0; i--)
{
arr[i + 1] = arr[i];
}
arr[0] = 0;
lenght ++;
}
}
int main()
{
int step = 0;
scanf("%d", &n);
scanf("%s", crr);
func_crr_to_arr();
// 循环处理整数数组,直到得到回文数或超过30步
while(!func_arr_palindrome_judge())
{
func_get_arr_reserve();
func_arr_reset();
step ++;
if(step >= 30)break;
}
// 输出结果:回文数所需要的步数或提示不可能得到回文数
if(step >= 30)printf("Impossible!");
else printf("STEP=%d", step);
return 0;
}