题解 P1015 【回文数】
顾z
2018-07-23 20:08:52
【算法分析】:
n进制运算;
1.当前位规范由%10改为%n
2.进位处理由/10改为/n
3.其他运算规则不变
【个人掉坑】:
Impossible后面有感叹号:“!”
倒叙再加正序
—————## 出处:《信息学奥赛一本通》##
------------
```cpp
#include<bits/stdc++.h>
#define inf 2147483647
#define IL inline
#define RI register int
using namespace std;
int n,len;
int num[102],b[103],step;
char s[103];
IL void read(int &x){
int f=1;x=0;char s=getchar();
while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}
while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
x*=f;
}
IL void print(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9) print(x/10);
putchar(x%10+'0');
}
IL bool check(int num[])
{
for(RI i=1;i<=num[0];i++)
if(num[i]!=num[num[0]-i+1])return false;
return true;
}
IL void pluss(int num[])
{
for(RI i=1;i<=num[0];i++)b[i]=num[num[0]-i+1];
for(RI i=1;i<=num[0];i++)num[i]+=b[i];
for(RI i=1;i<=num[0];i++)
{
num[i+1]+=num[i]/n;
num[i]%=n;
}
if(num[num[0]+1]>0)num[0]++;
}
int main()
{
read(n);
cin>>s;
num[0]=strlen(s);
for(RI i=1;i<=num[0];i++)
if(s[num[0]-i]<='9'&&s[num[0]-i]>='0')num[i]=s[num[0]-i]-'0';
else num[i]=s[num[0]-i]-'A'+10;
if(check(num)){printf("STEP=%d",step);exit(0);}
while(step<=30)
{
step++;
pluss(num);
if(check(num)){printf("STEP=%d",step);exit(0);}
}
printf("Impossible!");
}
```