#include <stdio.h> #include <stdlib.h> /* 十进制数转 数组N进制数 N 进制 D_num 十进制数 M_L 数组N的长度(初始正常是0, 会改变) return 数组N进制数 */ int* toN(int N, long long D_num, int *M_L) { int num[64] = {0}; // 存储伪N进制数 while (D_num > 0) { int a = D_num % N; // 得到余数 D_num = (D_num - a ) / N ; // 得到进位的数 num[*M_L] = a; *M_L += 1; } // 伪N进制数->数组表示 int* N_nums = calloc(*M_L + 1, sizeof(int)); for (int i = 0; i < *M_L; i++) { N_nums[*M_L - i - 1] = num[i]; } return N_nums; } /* 数组N进制数 转十进制数 N 进制 M 数组-进制数(索引越小位数越大) len 数组长度 return 十进制数 */ int toTen(int N, int *M, int len) { int D_num = 0; for (int i = len; i > 0; i--) { int a = 1; for (int j = i - 1; j > 0; j--) { a *= N; } D_num += (M[len - i] * a); } return D_num; } // 获得进制数位数 void getNums(int num, int *numL) { int _num = num; while (_num > 0) { _num /= 10; *numL += 1; } } int main() { int N; scanf("%d", &N); if (N > 16) { return 0; } char none; scanf("%c", &none); char M[100] = {""}; // 100位数,故长度100; int m_i; while (scanf("%c", &M[m_i]) != EOF) { m_i++; } // 确定位数 int M_L = 0; for (int i = 0; i < 100; i++) { if (M[i] == 10) break; // 换行结束 M_L += 1; } long long D_num = 0; int* _M = calloc(M_L, sizeof(int)); // 数组进制数,方便后面反一下 // 得到整数型数组进制数 for (int i = 0; i < M_L; i++) { if (48 <= M[i] && M[i] <= 57) _M[i] = M[i] - 48; else if (65 <= M[i] && M[i] <= 70) _M[i] = M[i] - 55; } D_num = toTen(N, _M, M_L); int STEP = 0; int isMoreThirty = 0; while (1) { STEP++; /*相加操作*/ // 反过来的进制数变十进制,然后相加 long long RD_num = 0; for (int i = 0; i < M_L; i++) { long long a = 1; for (int j = i; j > 0; j--) { a *= N; } RD_num += (a * _M[i]); } // 相加 D_num += RD_num; // 相加的数变回进制数,去判断回文及再次筛选 M_L = 0; _M = toN(N, D_num, &M_L); /*判断是否是回文数*/ // 得到对称长度 int left_l; // 对称左右长度 if (M_L % 2 != 0) { // 奇数进行加一操作 left_l = M_L / 2 + 1; } else { // 偶数不用 left_l = M_L / 2; } // 开始判断 int isFind = 1; for (int i = 0; i < left_l; i++) { if (_M[i] != _M[M_L - i - 1]) { isFind = 0; break; } } if (isFind) { break; } else if (STEP + 1 > 30) isMoreThirty = 1; } if (isMoreThirty) printf("Impossible!"); else printf("STEP=%d", STEP); return 0; }