题解 | #[NOIP1999]回文数#

[NOIP1999]回文数

https://www.nowcoder.com/practice/a432eb24b3534c27bdd1377869886ebb

//这题的难度相当大,我看了解题方法中的大佬C语言的答案比较难直接领会
//就特别写了详细的注解,希望你能轻松收获;
#include <stdio.h>
int n;//规定输入进制的变量
int arr[20] = {0};//储存改变进制的数组
int 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;//不是回文数返回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)//留出第一个位置为空位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();//改变进制

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

#你的秋招进展怎么样了#
全部评论

相关推荐

鼗:学校那里北改成中,学院改成大学 再放大以及加粗就行
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
6
1
分享

创作者周榜

更多
牛客网
牛客企业服务