题解 | #[NOIP1999]回文数#
[NOIP1999]回文数
https://www.nowcoder.com/practice/a432eb24b3534c27bdd1377869886ebb
#include <iostream>//抄大佬的
#include<cstring>
using namespace std;
char m[200];
int zhuan1(char x)//字符转int
{
int y=0;
if(x>='A'&&x<='E')
{
y=x-'A'+10;
}
if(x>='0'&&x<='9')
{
y=x-'0';
}
return y;
}
char zhuan2(int x)
{
char y;
if(x<10) y=x+'0';
else y=x-10+'A';
return y;
}
void sum(int n)//计算x进制加法,把结果覆盖到m数组中
{
char sum[200]={0};//sum记录顺序最左边为个位.
int len=strlen(m),i,jw=0;//使用jw来记录进位情况
for(i=0;i<len;i++)
{
int x,y;
x=zhuan1(m[i]);
y=zhuan1(m[len-i-1]);
int s=x+y;
sum[i]=zhuan2((s+jw)%n);
jw=(s+jw)/n;
}
if(jw!=0) sum[i]=zhuan2(jw);//最后一位进位
len=strlen(sum);
for(i=0;i<len;i++)//覆盖m
{
m[i]=sum[len-i-1];
}
}
int ifhuiwen()//判断m是不是回文数
{
int flag=1,len=strlen(m);
for(int i=0;i<len/2;i++)
{
if(m[i]!=m[len-i-1])
{
flag=0;
break;
}
}
return flag;
}
int main() {
int n;
scanf("%d",&n);
scanf("%s",m);
int count=0;
while(count!=31)//包含30步
{
if(ifhuiwen())
{
break;
}
else
{
sum(n);
count++;
}
}
if(count==31) cout<<"Impossible!"<<endl;
else cout<<"STEP="<<count<<endl;
return 0;
}
#菜狗的解题#

