#include <stdio.h>
#include <string.h>
//最主要注意数组下标位置!!!
void sum_judge_reverse(int judge_arr[], int reverse_arr[], int* lenth, int N)
{
//从低位开始相加,有进位产生进位
for (int i = *lenth - 1; i > 0; i--)
{
int sum = judge_arr[i] + reverse_arr[i - 1];
if (sum < N)//不产生进位
judge_arr[i] = sum;
else
{
judge_arr[i - 1] ++;//进位1
judge_arr[i] = sum % N;
}
}
//相加完后,判断高位有没有进位,如果有进位,整体再向后移动4个字节
//一直保持有进位的状态,并且可以直接调用回文判断(judge_palind_num)
if (judge_arr[0] != 0)
{
for (int i = *lenth-1; i >= 0; i--)
{
judge_arr[i+1] = judge_arr[i];
}
judge_arr[0] = 0;
(*lenth)++; //judge_arr 扩大4个字节
}
}
void judge_to_reverse(int judge_arr[], int reverse_arr[], int lenth)
{
for (int i = 1; i < lenth; i++)
{
reverse_arr[i - 1] = judge_arr[lenth-i];//注意judge_arr数组前多了一个judge_arr[0]
}
}
int judge_palind_num(int judge_arr[], int lenth)//判断回文数
{
int left = 1;
int right = lenth - 1;
while (right > left)
{
if (judge_arr[left++] != judge_arr[right--])
{
return 0; //前后存在一组不相等,返回0
}
}
return 1;//是回文数返回1
}
void turn_char_to_int(char receive_arr[], int judge_arr[], int* lenth)
{
for (int i = 1;i <= *lenth;i++)
{
//i 从1开始给judge_arr赋值,前面预留一位judge_arr[0] 用作进位
if (receive_arr[i-1] >= '0' && receive_arr[i-1] <= '9')
judge_arr[i] = receive_arr[i - 1] - '0';
else
judge_arr[i] = receive_arr[i - 1] - 'A' + 10;
}
(*lenth)++;//因为多了一位judge_arr[0]
}
int main(void)
{
int N;//进制
char receive_arr[100] = { 0 };//把数字当做字符串接收
int judge_arr[101] = { 0 };//判断是否为回文数数组,字符串转数字存到此数组中
int reverse_arr[100] = { 0 };//将judge_arr中的数字逆序放入此数组,并于judge_arr中的数相加
scanf("%d", &N);
scanf("%s", receive_arr);
int len = strlen(receive_arr);//计算输入数组的长度
int step = 0;
//1.把字符数组转化为数字
turn_char_to_int(receive_arr, judge_arr, &len);
for (step = 0; step < 30; step++)//循环判断30次,是否为回文数
{
//2.判断judge_arr数组是否为回文数
int ret = judge_palind_num(judge_arr, len);
if (ret)
break;//相等则跳出循环
else//不相等,则需要逆序相加
{
//3.获取逆序数组
judge_to_reverse(judge_arr, reverse_arr, len);
//4.将正序数字与逆序数字相加
sum_judge_reverse(judge_arr, reverse_arr, &len, N);
}
}
if (step < 30)
printf("STEP=%d\n", step);
else
printf("Impossible!\n");
return 0;
}