思路:当初以为只是单纯的将进制转换为十进制后调过来相加,没想到是不需要转换进制,在原进制下进行高精度的相加在判断
#include <cstdio>
#include <string.h>
using namespace std;
char s[110];
int main()
{
int n;
scanf("%d %s",&n,s);
int m[1001];
for(int i=0;i<strlen(s);i++) //将字符型数组转换成整形
{
if(s[i]>='A'&&s[i]<='F')
{
m[i]=s[i]-'A'+10;
}
else
{
m[i]=s[i]-'0';
}
}
int cnt=1;
int m_size=strlen(s);
for( ;cnt<=30;cnt++)
{
int t[1001];
memset(t,0,sizeof(t)); //清空一下数组可能数组初始不全为零
for(int i=0;i<m_size;i++)
{
t[i]=m[m_size-1-i];
//cout<<"t[i]="<<t[i]<<' '<<m[m_size-1]<<' '<<"size="<<m_size<<endl;
}
for(int i=0;i<m_size;i++) //高精度相加
{
t[i]+=m[i];
t[i+1]+=t[i]/n;
t[i]=t[i]%n;
}
int j=m_size;
if(t[j]>0)
{
j++;
m_size=j;
//cout<<m_size<<endl;
}
int g=0,h=0;
for(h=0;h<j/2;h++)
{
if(t[h]!=t[j-h-1])
{
break;
}
}
if(h==j/2)
{
g=1;
}
if(g==1)
{
break;
}
int k=j-1;
j-=1;
for( ;j>=0;j--)
{
m[k-j]=t[j];
// cout<<cnt<<' '<<t[j]<<endl;
}
}
if(cnt<=30)
{
cout<<"STEP="<<cnt;
}
else
{
cout<<"Impossible!";
}
return 0;
}