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

353d3d3b2ce5

解法

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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值