【输入】
N M
【输出】
如果能在30步以内得到回文数,则输出步数,否则输出-1;
【例如输入】
9 87
【输出】
6
//练习题,回文数
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int n, step;
string m;
int num[1005];
//判断是否是回文数
bool judge(int x)
{
for (int i = 1; i <= x / 2; ++i)
{
if (num[i] != num[x - i + 1])
return false;
}
return true;
}
//n进制数相加
int add(int x)
{
int ans[1005] = {0};
for (int i = 1; i <= x; ++i) {
ans[i] = num[i] + num[x - i + 1] + ans[i];
ans[i + 1] += ans[i] / n;
ans[i] %= n;
}
if (ans[x + 1])
x++;
for (int i = x; i >= 1; --i)
{
num[i] = ans[i];
}
return x;
}
int main()
{
cin >> n >> m;
int len = m.size();
//转换为十进制
for (int i = 1; i <= len; ++i)
{
if (m[i - 1] < 65)
num[i] = m[i - 1] - '0';
else
num[i] = m[i - 1] - 'A' + 10;
}
//步数限制
while (step <= 30)
{
if (judge(len))
{
cout << "Step=" <<step <<endl;
return 0;
}
step++;
len = add(len);
}
cout << "Impossible!" << endl;
return 0;
}