#include <stdio.h> #include<string.h> char x[200] = { 0 }, y[200] = { 0 };//设置全局变量减少使用函数传参的繁琐 void Offset(char m[200], int longs) {//使用数值对应的ASCII码代替A~F for (int i = 0; i < longs; i++) {//例如:存入'A',表示10,但ASCII值为65 if (m[i] >= '0' && m[i] <= '9') {//将'A'-'A'+10,ASCII值就变成10. m[i] = m[i] - '0'; } if (m[i] >= 'A' && m[i] <= 'F') { m[i] = m[i] - 'A' + 10; } } } int Check(int longs) { for (int i = 0, k = longs - 1; i < k; i++, k--) { if (x[i] != x[k]) return 1; } return 0; } void Change(int longs) { for (int i = 0, k = longs - 1; k >= 0; k--, i++) { y[i] = x[k]; } } int Add(int n, int longs) { Offset(x, longs); //将数组x,y内字符变成对应ASCII相同的数 Offset(y, longs); char Sum[200] = { 0 }; for (int k = 0, i = longs - 1; i >= 0; i--, k++) {//把两数组之和倒放在Sum数组中 int sum = x[i] + y[i] + Sum[k]; Sum[k] = sum % n; Sum[k + 1] = sum / n; if (sum / n > 0 && i == 0) { longs++;//如果首位之和需要进一位,则需要把数组长度加一位 } } for (int j = 0; j < longs;j++) {//把Sum回放x数组并转换成原来进制 x[j] = Sum[longs - j - 1]; if (x[j] >= 0 && x[j] <= 9) { x[j] = x[j] + '0'; } if (x[j] >= 10 && x[j] <= 16) { x[j] = x[j] - 10 + 'A'; } } return longs; } int main() { int n, count = 0; scanf("%d\n%s", &n, x); int len = strlen(x);//记录x数组的元素个数, //注意:strlen()从字符串的开头位置依次往后面计数,直到遇到‘\0’停止,所计算的字符串大小为‘\0’以前的字符所计算的值,最终的字符串长度不包括‘\0’ //所以后面x数组改变后不能再使用strlen函数,因为x数组可能中间存在0,导致计算出的元素个数不对 while (Check(len)) { //判断是否是回文数 if (count > 30) { printf("Impossible!");//判断进行步数 return 0; } Change(len);//把x的翻转数存到y数组中 len = Add(n, len); //将两数组相加, count++; } printf("STEP=%d", count); return 0; }