看了视频发现这个老师讲的思路好清晰
用函数一个一个做真的很清晰。
#include <bits/stdc++.h>
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
int n, slong, ans;//最终的次数
int q[1000], w[1000];
string s;
void add(int a[], int b[])//高精度相加
{
for (int i = 1; i <= slong; i++)
{
a[i] += b[i];
a[i + 1] += a[i] / n;
a[i] %= n;
}
if (a[slong + 1] > 0)
slong++;
}
void turn(int a[])
{
int j = 0;
for (int i = slong; i >= 1; i--)
{
w[++j] = a[i];
}
}
bool hw(int a[])
{
int ln = slong;
int i = 1;
int j = slong;
while (ln--)
{
if (ln < (slong / 2))
break;
if (a[i] != a[j])
return false;
i++;
j--;
}
return true;
}
void init()
{
int j = 0;
for (int i = slong - 1; i >= 0; i--) //因为算加减法的时候是从后往前,所以提前处理
{
if (isdigit(s[i]))
q[++j] = s[i] - '0'; // q[1]=s[slong()] 末尾的数
else
q[++j] = s[i] - 'A' + 10;
}
}
int main()
{
cin >> n >> s;
slong = s.size();//将输入字符的长度定义
init(); //首先对字符进行一个处理,因为0<= n <=10 || n==16 所以是专门对n==16进行的一个处理
while (!hw(q)) //如果不是回文数就进行操作
{
turn(q); //如果不是回文数列,就进行反转
add(q, w); //把反转的跟没反转的相加; 高精度相加
ans++; //判断次数
if (ans > 30)
break;
}
if (ans > 30)
cout << "Impossible!" << endl;
else
cout << "STEP=" << ans << endl;
system("pause");
}
py自带高精度,真不错呀
def f(s,k):
mu_ban="0123456789ABCDEF";a=""
while s>0:#注意这里是大于0
yu_shu=s%k
s=s//k
a+=mu_ban[yu_shu]
return a[::-1]
n=int(input())
m=input();ans=0
while ans<30 and (m!=m[::-1]):
m=f(int(m,n)+int(m[::-1],n),n)
ans+=1
if ans>=30:
print("Impossible!")
else:
print(f'STEP={ans}')