4月4日
这个题目我们需要掌握回文数的判断,还有就是N进制计算的掌握,我们可以把这个计算方法记下来,回文数如果是奇数我们需要保证中心数的两边相等,偶数两边相等,总而言之就是两边是对称的就可以称为是回文数,这个题目不能使用string转为数字,因为不仅仅是因为是16进制的问题,string转数字可能也会超过其类型的范围,使用我们使用数组来解决这个问题。
#include<iostream>
#include<cstring>
using namespace std;
int n;
int a[500],b[500],step=0;
string str;
void add(int a[],int b[])
{
int i;
for(i=1;i<=a[0];i++)
{
a[i]+=b[i];
a[i+1]+=a[i]/n;
a[i]%=n;
}
if(a[a[0]+1]>0)
a[0]+=1;
}
bool hws(int a[])
{
int i;
for(i=1;i<=a[0]/2;i++)
if(a[i]!=a[a[0]-i+1])
return false;
return true;
}
void dx(int a[])
{
int i,j;
b[0]=a[0];
j=1;
for(i=a[0];i>=1;i--)
{
b[j]=a[i];
j++;
}
}
int main()
{
int len;
int i;
cin>>n>>str;
len=str.size();
int k=1;
for(i=len-1;i>=0;i--)
{
if('0'<=str[i]&&str[i]<='9')
{
a[k]=str[i]-'0';
k++;
}
if('A'<=str[i]&&str[i]<='Z')
{
a[k]=str[i]-'A'+10;
k++;
}
}
a[0]=len;
while(hws(a)==0)
{
dx(a);
add(a,b);
step++;
if(step>30)
break;
}
if(step>30)
cout<<"Impossible!"<<endl;
else
cout<<"STEP="<<step<<endl;
return 0;
}