问题描述

若一个数(首位不为零)从左往右读与从右往左读都是一样,,我们就将其称之为回文数。例如:给定一个10进制数56,将56加65(即把56从右往左读),得到121是一个回文数。又如,对于十进制数87,step1:87+78=165step2:165+561=726step3:726+627=1353step4:1353+3531=4884在这里的一步是指进行了一次n进制的加法,上例最少用了4步得到回文数4884.写一个程序,给定一个n(2<n<=10或n=16)进制数m。求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“impossible”。

【输入样例】

9 87

【输出样例】

6

【算法分析】

n进制运算

1.当前位规范有10%改为n%

2.进位处理由/10改为/n

3.其他运算规则不变

【参考代码】

#include <iostream>
#include <cstring>
using namespace std;
int n,a[101],b[101],ans,i;
void init (int a[])
{//将数串s转化为整数数组a
string s;
cin>>n>>s;
//读入字符串s
memset(a,0,sizeof(a));
//数组a清零
a[0]=s.length();
//用a[0]计算字符串s的位数
for(i=1;i<=a[0];i++)
{
if(s[a[0]-i]>='0'&&s[a[0]-i]<='9')
{
a[i]=s[a[0]-i]-'0';
}
else
{
a[i]=s[a[0]-i]-'A'+10;
}
}
}
bool check(int a[])
{//判别整数数组a是否为回文数
for(i=1;i<=a[0];i++)
{
if(a[i]!=a[a[0]-i+1])
return false;
}
return true;
}
void jia(int a[])
{//整数数组a与其反序数b进行n进制加法运算
int i,k;
for(i=1;i<=a[0];i++)
{//反序数b
b[i]=a[a[0]-i+1];
}
for(i=1;i<=a[0];i++)
{//逐位相加
a[i]+=b[i];
}
for(i=1;i<=a[0];i++)
{//处理进位
a[i+1]+=a[i]/n;
a[i]%=n;
}
if(a[a[0]+1]>0)
{//修正新的a的位数(a+b最多只能进一位)
a[0]++;
}
}
int main ()
{
init(a);
if(check(a))
{
cout<<0<<endl;
return 0;
}
ans=0;
//步数初始化为0
while(ans<=30)
{
ans++;
jia(a);
if(check(a))
{
cout<<ans<<endl;
return 0;
}
}
cout<<"impossible";
return 0;
}