题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数 565656 ,将 565656 加 656565 (即把 565656 从右向左读),得到 121121121 是一个回文数。
又如:对于十进制数 878787 :
STEP1: 878787 + 787878 = 165165165
STEP2: 165165165 + 561561561 = 726726726
STEP3: 726726726 + 627627627 = 135313531353
STEP4: 135313531353 + 353135313531 = 488448844884
在这里的一步是指进行了一次 NNN 进制的加法,上例最少用了 444 步得到回文数 488448844884 。
写一个程序,给定一个 NNN ( 2≤N≤10,N=162 \le N \le 10,N=162≤N≤10,N=16 )进制数 MMM ( 100100100 位之内),求最少经过几步可以得到回文数。如果在 303030 步以内(包含 303030 步)不可能得到回文数,则输出Impossible!
输入输出格式
输入格式:
两行,分别是 NNN , MMM 。
输出格式:
STEP=ans
输入输出样例
输入样例#1:
10
87
输出样例#1:
STEP=4
#include <cstdio>
#include <cstring>
char num[110];
int m[1100],fm[1100];
int main(){
int n,ans=0,t=0,f=1;
scanf("%d",&n);
scanf("%s",num);
for(int i=0;i<strlen(num);i++){
if(num[i]>'9')m[i]=num[i]-55;
else m[i]=num[i]-'0';
}
int str=strlen(num);
for(int i=0;i<30;i++){
f=1;
t=0;
for(int j=0;j<str;j++){
fm[j]=m[str-j-1]+m[j]+t;
t=fm[j]/n;
fm[j]%=n;
}
if(t!=0){
fm[str]=t;
str++;
}
for(int j=0;j<str;j++)
if(fm[j]!=fm[str-j-1]){
f=0;
break;
}
if(f==1){
printf("STEP=%d",i+1);
return 0;
}
for(int j=0;j<str;j++)m[j]=fm[j];
}
printf("Impossible!");
return 0;
}