1045 回文数
#include <iostream>
#include<string>
#include <algorithm>
#include<sstream>
using namespace std;
string sp="0123456789ABCDEF";
//为了不用从int转字符而定义的的string, 相同的数字就能对应相应的字符
string add(string a,string b,int N)
{
string result = "";//结果
int Length = a.length();//a,b的字符长度
int flag = 0;//是否进位
if(N == 16)//如果是十六进制要单独处理
{
for(int i = 1;i<=Length;++i)
{
int a1,b1;//记录当前位的数字
if(a[Length-i]<'A')
a1 = a[Length-i]-48;
else
a1 = sp.find(a[Length-i],0);
if(b[Length-i]<'A')
b1 = b[Length-i]-48;
else
b1 = sp.find(b[Length-i],0);
//以上的处理是,将当前的字符转为int
int sum = a1 + b1 + flag;//计算两数字当前位数的相加
if(sum>=N) flag = 1;//如果和大于等于进制则进位
else flag = 0;//不进位
sum = sum % N;//取模
result = sp[sum] + result;//更新结果
}
if(flag) result = "1" + result;
return result;
}
for(int i = 1;i<=Length;++i)
{
int a1 = a[a.length()-i]-48;
int b1 = b[b.length()-i]-48;
//以上字符转int
int sum = a1 + b1 + flag;
if(sum>=N) flag = 1;
else flag = 0;
sum = sum % N;
result = sp[sum] + result;
//以上同16进制
}
if(flag) result = "1" + result;
return result;
}
void iter()//迭代相加操作
{
int n;
string m;
cin>>n>>m;
//读入操作
int step=0;步数
while(step<=30)
{
string m1=m;
reverse(m1.begin(),m1.end()); //将字符反转
if(m==m1)//如果反转后和原来相等,则结束,打印step
{
cout<<"STEP=" <<step;
return;
}
else
{
m=add(m,m1,n);//不相等,则,相加起来
step++;//步数增长
}
}
cout<<"Impossible!";
}
int main()
{
iter();
return 0;
}