解题思路:

分步求解:

  1. 获得输入,进制(整数),数字(存为字符串数组);

  2. 获取输入数字的长度;

  3. 将字符串数组转化为整型数组(便于后续处理);

  4. 将输入的数字反向;

  5. 将输入的正向数字与转向后的反向数字相加;

  6. 判断相加后的和是否为回文;

  7. 循环反向并相加。

    注意事项:

    1. 输入进制的目的是按照输入的进制直接进行相加,而不需要换成十进制。

    2. 在相加的过程中 数字的长度是变化的,需要根据最新的结果更新。


参考代码:



#include <stdio.h>

#include <stdlib.h>

#include <math.h>


//对输入的数字 字符串 进行翻转

void intRever(int origNum[], int length, int tarNum[])

{

    int i,j;

    for(i = 0, j = length -1; i < length; i++, j--)

    {

        tarNum[i] = origNum[j];

    }

    tarNum[i] = '\0';

}


//判断输入数据是否为回文数

int isRever(int origNum[], int length)

{

    int i,j;

    i=0;

    j=length-1;

    while(i<j && origNum[i]==origNum[j])

    {

        i++;

        j--;

    }

    return i>=j;

}


//逐步递增获取回文数

void getPalin(int origNum[], int *length, int tarNum[], int hex)

{

    int i,k = 0;

    for(i = 0; i < *length; i++)

    {

        origNum[i] = origNum[i] + tarNum[i] + k;

        k = origNum[i]/hex;

        origNum[i] %= hex;

    }

    if(k > 0)

    {

        origNum[i] = k;

        *length = i+1;

    }

    

}


void charToInt(char origInput[],int length,int origNum[])

{


    int i = 0;

    

    for(i =  0; i < length; i++)

    {

        if(origInput[i] >= 'A' && origInput[i] <= 'F')

            origNum[i] = origInput[i] - '0' - 7;

        else if(origInput[i] >= 'a' && origInput[i] <= 'f')

            origNum[i] = origInput[i] - '0' - 39;

        else if(origInput[i] >= '0' && origInput[i] <= '9')

            origNum[i] = origInput[i] - '0';

        else

        {

            printf("input error\n");

        }

    }

    origNum[i] = '\0';

    

}


int main()

{

    int hex;

    char charInput[1000];

    int stepTotal = 30;

    

    while((scanf("%d",&hex)==1))

    {

        if(hex < 2 || hex > 16)

        {

            return 0;

        }

        if((scanf("%s",charInput)==1))

        {

            int origNum[1000] = {0};

            int tarNum[1000] = {0};

            int step = 0;

            int length = strlen(charInput);

            charToInt(charInput,length,origNum);

            while(step<=stepTotal)

            {

                intRever(origNum, length, tarNum);

                getPalin(origNum, &length, tarNum, hex);

                step += 1;

                if(isRever(origNum, length)==1)

                {

                    printf("STEP=%d\n",step);

                    break;

                }

            }

            if(step > stepTotal)

                printf("Impossible!\n");

        }

    }

    

    return 0;

    

}

点赞(2)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论