高精度 + 回文判断 即可
算法流程
1. 将输入的数存在数组int a[]
中
void str2array(string str, int a[])
{
int j = 0;
for (int i = str.length() - 1; i >= 0; i -- )
{
if ('0' <= str[i] && str[i] <= '9') a[ ++ j] = str[i] - '0';
else a[ ++ j] = str[i] - 'A' + 10;
}
}
2. 判断是否回文
bool check(int a[], int len)
{
for (int i = 1, j = len; i <= len >> 1; i ++ , j -- )
if (a[i] != a[j]) return false;
return true;
}
3. 若回文 输出操作的Step
数, 否则先对数进行翻转
void flip(int a[], int ra[], int len)
{
int j = 0;
for (int i = len; i >= 1; i -- )
ra[ ++ j] = a[i];
}
4. 进行高精度加法, 然后回到步骤2
void add(int a[], int b[])
{
for (int i = 1; i <= len; i ++ )
{
a[i] += b[i];
a[i + 1] += a[i] / n;
a[i] %= n;
}
if (a[len + 1]) len ++ ;
}
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, len;
int a[N], ra[N];
string str;
// 将string放入int数组中
void str2array(string str, int a[])
{
int j = 0;
for (int i = str.length() - 1; i >= 0; i -- )
{
if ('0' <= str[i] && str[i] <= '9') a[ ++ j] = str[i] - '0';
else a[ ++ j] = str[i] - 'A' + 10;
}
}
// 检查是否为回文
bool check(int a[], int len)
{
for (int i = 1, j = len; i <= len >> 1; i ++ , j -- )
if (a[i] != a[j]) return false;
return true;
}
// 将a数组中的值翻转存入ra中
void flip(int a[], int ra[], int len)
{
int j = 0;
for (int i = len; i >= 1; i -- )
ra[ ++ j] = a[i];
}
// a + b
void add(int a[], int b[])
{
for (int i = 1; i <= len; i ++ )
{
a[i] += b[i];
a[i + 1] += a[i] / n;
a[i] %= n;
}
if (a[len + 1]) len ++ ;
}
int main()
{
cin >> n >> str;
str2array(str, a);
len = str.length();
int cnt = 0;
while (!check(a, len))
{
flip(a, ra, len); // 如果不为回文 则将反转的a 放入ra中
add(a, ra); // a 和 ra进行相加 结果存在a中
cnt ++ ; // 操作统计数 cnt ++ ;
if (cnt > 30) break;
}
if (cnt > 30) puts("Impossible!");
else cout << "STEP=" << cnt << endl;
return 0;
}