NOIP 1999 普及组 复赛 回文数
//1309 【例1.6】回文数(Noip1999)
//高精度加算法,很有信心
//后判断
//翻转
//先加
//30步跳出
//仔细看题,发现并不只是十进制,是N进制,马上意识到该题的难度了
//过了一晚之后,再想想,只要把十进制中的10换成N,并编写一个打印函数,打印位上的值大于等于10的 即可。
//题目没有明确位数个数,故数组均开到500
//样例通过,提交,未通过,
//因是历年NOIP普及组 复赛试题,容易得到测试数据
//看了看,确实会比较难过,因为输入数据中就有16进制
//马上对读取后的数据进行修改处理,题中没有说输入数据是否大写,或是小写,一并处理了
//再次提交,全未通过,查看原始输入输出数据
//查了 洛谷 P1015 回文数
//https://www.luogu.org/problemnew/show/1015
//洛谷上通过后,再进行提交,AC,
//http://ybt.ssoier.cn:8088中该题,没法看,直接参考洛谷里的题目,按里面的输入输出要求进行提交
//2017-11-10
#include <stdio.h>
#include <string.h>
int N,a[500],b[500],step=0;
char s[500];
void add(int a[],int b[]){
int i;
for(i=1;i<=a[0];i++){
a[i]+=b[i];
a[i+1]+=a[i]/N;
a[i]%=N;
}
if(a[a[0]+1]>0)a[0]+=1;
}
int judge(int a[]){//0非回文,1回文
int i;
for(i=1;i<=a[0]/2;i++)
if(a[i]!=a[a[0]-i+1])
return 0;
return 1;
}
void overturn(int a[]){
int i,j=0;
b[0]=a[0];
for(i=a[0];i>=1;i--)
b[++j]=a[i];//此处写成b[j]=a[i],j++;
}
void print(int a[]){
int i;
for(i=a[0];i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
int main(){
int len,i,k=0;
scanf("%d%s",&N,s);
len=strlen(s);
for(i=len-1;i>=0;i--)//重写读入数据的处理
if('0'<=s[i]&&s[i]<='9')
a[++k]=s[i]-'0';
else if('a'<=s[i]&&s[i]<='z')
a[++k]=s[i]-'a'+10;
else if('A'<=s[i]&&s[i]<='Z')
a[++k]=s[i]-'A'+10;
a[0]=len;
while(judge(a)==0){
//printf("1 "),print(a);
overturn(a);
//printf("2 "),print(b);
add(a,b);
//printf("3 "),print(a);
step++;
if(step==31)break;
}
if(step==31)printf("Impossible!");//此处写成 printf("Impossible");
else printf("STEP=%d",step);//此处写成 printf("%d",step);
return 0;
}