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

解法

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

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

#include
#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:回文数 一种解法)