用字符串进行处理
#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;
}