美文网首页玩味小白程序🐒
【普及-】洛谷P1015:回文数 一种解法

【普及-】洛谷P1015:回文数 一种解法

作者: 胜言_ | 来源:发表于2020-07-29 09:22 被阅读0次

解法

这里考虑到进制的问题,需要把所输入的数字作为字符串(数组名为origin,16进制为大写字母),然后通过转换化为一个个的十进制数位,作为数组的数据元素,这样,在判断是否回文的时候直接从数组两边取十进制数进行比较即可,不用考虑个别进制的问题。
由于每一位数字最大只能是15(16进制的数位最大),所以这里的数组为char类型的。
考虑到加法计算是从低位开始的,所以这里把这些数位倒着放到一个数组里(数组名为reverse),然后计算起来比较方便。
还要考虑加法的进位问题,其实就是低位相加,如果超过了进制n,则向高位进1,这个在函数sumDigit中进行运算。
由于原数组(reverse)在运算中不会改动,所以只输入一个数组,从它的两边分别取数进行计算,然后存储到res结果数组里,然后根据题意进行判断、递归计算。

注意:除了origin数组,其余数组在位置0不放数据,统一从位置1开始存数据。

#include<stdio.h>
#define MAX 150
#define STEP_MAX 30
int step = 0, i = 0, len = 0, leni = 0;

int youJiWei(char array[]) {
    // 得出倒放的数组存储的数位的实际位数
    for (i = MAX-1; i >= 0; i--) {
        if (array[i] != 0) {
            return i;
        }
    }
    return -1;
}

int strlen(char array[]) {
    //得出origin数组的长度
    for (i = 0; i < MAX; i++) {
        if (array[i] == 0) {
            return i;
        }
    }
    return -1;
}

int isHuiWen(char array[]) {
    //判断回文,array[]数组为倒放的数位数组
    len = youJiWei(array);
    leni = len;
    for (i = 1; i <= (len / 2); i++) {
        if (array[i] != array[leni--]) {
            return 0;
        }
    }
    return 1;
}

void sumDigit(char array[], int n) {
    // 数位的加法运算,以及根据题意进行判断
    char res[MAX] = { 0 };

    len = youJiWei(array);
    leni = len;
    for (i = 1; i <= len; i++, leni--) {
        if ((res[i] + array[i] + array[leni]) >= n) {
            res[i] = (res[i] + array[i] + array[leni]) % n;
            res[i + 1]++;
        }
        else {
            res[i] += (array[i] + array[leni]);
        }
    }
    step++;

    if (isHuiWen(res)) {
        printf("STEP=%d", step);
        return;
    }
    else if (step >= STEP_MAX) {
        printf("Impossible!");
        return;
    }
    else {
        sumDigit(res, n);  //递归
    }
}

int main() {
    int n;
    char origin[MAX] = { 0 }, reverse[MAX] = { 0 };

    scanf_s("%d%s", &n, origin, MAX);

    len = strlen(origin);
    leni = len;
    for (i = 0; i < len; i++) {  // 拆解出数位,存放到reverse数组
        if (origin[i] >= '0' && origin[i] <= '9') {
            reverse[leni--] = origin[i] - '0';
        }
        else {
            reverse[leni--] = origin[i] - 'A' + 10;
        }
    }

    sumDigit(reverse, n);

    return 0;
}

相关文章

  • 【普及-】洛谷P1015:回文数 一种解法

    解法 这里考虑到进制的问题,需要把所输入的数字作为字符串(数组名为origin,16进制为大写字母),然后通过转换...

  • 回文数最优解

    回文数 非回文数 JAVA 解法

  • 求最大长度回文数

    解法1:暴力列举所有子数,再求回文数,时间复杂度O(n^3)解法2:遍历所有字符,查找所有基于此字符的回文数,时间...

  • 算法(leetode,附思维导图 + 全部解法)300题之(9)

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(9)回文数 一 题目描述 二 解法总览(思维...

  • 记录20200830

    LeetCode 214题,最短回文数 利用 Python 切片 KMP解法 比如求 s = "abc" 的最短回...

  • LeetCode-9-回文数

    题目描述 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 解法1 ...

  • 蓝桥杯:回文数--Python解法

    问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。 输出格式 按从...

  • 蓝桥杯:特殊回文数--Python解法

    问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n, 编程求所有这样的五位和...

  • 关于回文问题

    回文问题的解法:双指针,栈,reverse 1. 409. 最长回文串[✔]2. 125. 验证回文串[✔]3. ...

  • leecode刷题(31) -- 回文数

    leecode刷题(31) -- 回文数 回文数 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右...

网友评论

    本文标题:【普及-】洛谷P1015:回文数 一种解法

    本文链接:https://www.haomeiwen.com/subject/tancrktx.html