【题目描述】
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 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(2<N<=10或N=16)进制数M。
【输出】
最少几步。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。
【输入样例】
9 87
【输出样例】
6
#include <iostream>
using namespace std;
const int maxn = 1011;
int n;
char m[maxn];
int a[maxn];
void add(int a[]){
int b[maxn]; memset(b,0,sizeof(b));
//将a倒置与b
for(int i = 1; i <= a[0]; i++){
b[i] = a[a[0]-i+1];
}
//相加
for(int i = 1; i <= a[0]; i++) a[i] += b[i];
//进位处理
for(int i = 1; i <= a[0]; i++){
if(a[i] >= n){
a[i+1]++;
}
a[i] = a[i] % n;
}
//重新设置a的长度
if(a[a[0]+1] != 0) a[0]++;
}
bool check(int a[]){
for(int i = 1; i <= a[0]/2; i++){
if(a[i] != a[a[0]-i+1]) return false;
}
return true;
}
int main(int argc, char const *argv[]){
cin >> n >> m;
memset(a,0,sizeof(a));
a[0] = strlen(m);
//将m字符数组,转换为int数组,并逆置
//下标0代表个位,以便于进位,取模
for(int i = 0; i < a[0]; i++){
if(m[i] >= '0' && m[i] <= '9') a[a[0]-i] = m[i] - '0';
else a[a[0]-i] = m[i] - 'A' + 10;
}
int num = 1;
while(num <= 30){
num ++;
add(a);
if(check(a)){
cout << num-1 << endl;
return 0;
}
}
cout << "Impossible" << endl;
return 0;
}