#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;
}