若一個數(首位不爲零)從左向右讀與從右向左讀都一樣,我們就將其稱之爲迴文數。
例如:給定一個10進制數56,將56加65(即把56從右向左讀),得到121是一個迴文數。
又如:對於10進制數87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在這裏的一步是指進行了一次N進制的加法,上例最少用了4步得到迴文數4884。
寫一個程序,給定一個N(2<=N<=10或N=16)進制數M,求最少經過幾步可以得到迴文數。
如果在30步以內(包含30步)不可能得到迴文數,則輸出“Impossible!”
n和m
步數
9
87
STEP=6
e
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
char m[50]={0};
bool check(){
int tmp = strlen(m),i;
for(i=0;i<tmp/2;i++){
if(m[i]!=m[tmp-1-i])
return false;
}
return true;
}
void sum(){
int tmp = strlen(m);
char a[50]={0};
char b[50]={0};
char c[50]={0};
int z=49;
for(int i=0;i<tmp;i++){
a[z]=m[i];
b[z--]=m[tmp-1-i];
}
z=49;
int s;
c[49]='0';
while(a[z]){
//s=a[z]-'0'+b[z]-'0'+c[z]-'0';
int x,y,zz;
if(a[z]>='0'&&a[z]<='9')
x=a[z]-'0';
else
x=a[z]-55;
if(b[z]>='0'&&b[z]<='9')
y=b[z]-'0';
else
y=b[z]-55;
if(c[z]>='0'&&c[z]<='9')
zz=c[z]-'0';
else
zz=c[z]-55;
s=x+y+zz;
int k=s%n,k1=s/n;
if(k>=10)
k+=55;
else
k+=48;
if(k1>=10)
k1+=55;
else
k1+=48;
c[z]=k;
c[z-1]=k1;
z--;
}
int j=0;
if(c[z]=='0')z++;
for(;z<50;z++){
m[j++]=c[z];
}
m[j]=0;
}
int main(){
scanf("%d %s", &n, m);
//判斷是否是迴文數
if(check())
{
printf("STEP=0\n");
return 0;
}
for(int i=0;i<30;i++){
//加
sum();
//判斷是否是迴文數
if(check())
{
printf("STEP=%d\n",i+1);
return 0;
}
}
printf("Impossible!\n");
return 0;
}