用字符串进行处理
#include <stdio.h> #include <string.h> #include <stdbool.h> bool judge(const char M[], int len)//判断 M 中的值是否为回文数 { int i = 0; for (i = 0; i < len / 2; i++) { if (M[i] != M[len - 1 - i]) { return false; } } return true; } void step(int N, char M[], int len) { int i = 0;//计数器 int quot = 0;//商值 int n = 0;//头尾一对数的和 char m[100] = { '\0' };//倒着存放总和 // N 进制的加法运算 for (i = 0; i < len; i++) { //从头开始 if (M[i] > '9')//值为 10 或 10 以上的情况 { n = M[i] - 'A' + 10; } else//值为:0 ~ 9 的情况 { n = M[i] - '0'; } //从末尾开始 if (M[len - 1 - i] > '9')//值为 10 或 10 以上的情况 { n += M[len - 1 - i] - 'A' + 10; } else//值为:0 ~ 9 的情况 { n += M[len - 1 - i] - '0'; } if (1 == quot)//商为 1 时,进一位 { n++; } quot = n / N;//求商 n %= N;//求应储存在 m 中的值 if (n > 9)//值为 10 或 10 以上的情况 { m[i] = n - 10 + 'A'; } else//值为:0 ~ 9 的情况 { m[i] = n + '0'; } } //若最后一次加法运算后要进一位,则在这里进行处理 if (1 == quot) { m[len] = '1';//进一位 len++;//扩展 m 的长度 } //逆着存 m 的值到 M 中,使最后 M 中的值是正序的 //方便在 judge 函数中判断回文数 for (i = 0; i < len; i++) { M[i] = m[len - 1 - i]; } } int main() { int N = 0;//进制 char M[100] = { '\0' };//数 scanf("%d %s", &N, M);//数据输入 int i = 0;//计数器 //数据处理 //循环 30 次, 即30 步 for (i = 0; i < 30; i++)//若最后一次循环的值仍不是回文数,i = 29 + 1 = 30 { step(N, M, strlen(M)); if (judge(M, strlen(M))) { break; } } //数据输出 if (i < 30)//在30步以内得到回文数的情况 { printf("STEP=%d\n", i + 1); } else//在30步以内未得到回文数的情况 { printf("Impossible!\n"); } return 0; }