解法
这里考虑到进制的问题,需要把所输入的数字作为字符串(数组名为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;
}