根据提示,我们可以按照指定的步骤模拟运算即可,唯一需要注意的是对于16进制的处理,这里把相应的A~F全部化为10+‘0’,11+‘0’。。。。等形式(不会影响运算的正确性)。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn = 100 ;
char numa[maxn] ;
int numb[maxn] ;
int n ;
int m ;
bool Is_Par();
void work() ;
void cacu() ;
int main()
{
work() ;
return 0 ;
}
void work()
{
scanf("%d\n%s" , &n , numa) ;
if(n==16)
{
for(int i = 0 ; i < strlen(numa) ; i ++)
{
if(numa[i]=='A'||numa[i]=='B'||numa[i]=='C'||numa[i]=='D'||numa[i]=='E'||numa[i]=='F')
{
numa[i] = numa[i] - 'A' + 10 + '0' ;
}
}
}
m = 0 ;
while(!Is_Par() && m <= 30)
{
cacu() ;
m ++ ;
}
if(m<=30)
printf("%d\n" , m) ;
else
printf("Impossible\n") ;
}
bool Is_Par()
{
int i ;
int len ;
len = strlen(numa) ;
i = 0 ;
while(i < len/2)
{
if(numa[i] != numa[len - i -1])
return 0 ;
i ++ ;
}
return 1 ;
}
void cacu()
{
int len ;
int i ;
int j ;
len = strlen(numa) ;
for(i = len - 1 ; i >= 0 ; i --)
{
numb[i] = (numa[i] - '0') + (numa[len - i - 1] - '0') ;
}
j = 0 ;
for(i = 0 ; i < len ; i ++)
{
numb[i+1] += numb[i] / n ;
numb[i] = numb[i]%n ;
}
bool first = 0 ;
j = 0 ;
for( ; i >= 0 ; i--)
{
if(first)
{
numa[j] = numb[i] + '0' ;
j ++ ;
}
else if(numb[i] != 0)
{
numa[j] = numb[i] + '0' ;
j++ ;
first = 1 ;
}
}
}