思路:当初以为只是单纯的将进制转换为十进制后调过来相加,没想到是不需要转换进制,在原进制下进行高精度的相加在判断

#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;
}