折磨人的回文数

题目:

描述

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个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

示例1

输入:

9
87

输出:

STEP=6

思路:

这段代码的主要思路是通过循环迭代来判断一个数是否是回文数。具体的步骤如下:

  1. 首先,程序读入一个进制数 n 和一个字符数组 crr
  2. 然后,通过函数 func_crr_to_arr 将字符数组转换为整数数组 arr,并统计数组的长度。
  3. 接下来,进入一个循环,每次循环都判断整数数组 arr 是否是回文数(即正序和逆序相同)。
    • 如果是回文数,跳出循环。
    • 如果不是回文数,调用函数 func_get_arr_reserve 获取 arr 的逆序存储在 arr_r 中。
    • 然后调用函数 func_arr_reset 对 arr 进行处理,使其加上逆序后仍然满足进制要求。
    • 循环的次数由变量 step 记录,并在每次循环后递增。
    • 如果超过30步还没有得到回文数,则输出 "Impossible!"。
  4. 最后,根据 step 的值输出结果。

总的来说,该代码通过迭代判断和处理整数数组,直到得到回文数或超过30步为止。这种方法可以用于解决回文数问题。

代码:

#include 

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;
}

折磨人的回文数_第1张图片

你可能感兴趣的:(算法,c语言,学习,经验分享,数据结构)