【题目描述】
若一个数(首位不为零)从左向右读与从右向左读都是同样,咱们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),获得 121是一个回文数。又如,对于10进制数87,ios
STEP1: 87+78= 165 STEP2: 165+561= 726数组
STEP3: 726+627=1353 STEP4:1353+3531=4884spa
在这里的一步是指进行了一次N进制的加法,上例最少用了4步获得回文数4884。code
写一个程序,给定一个N(2<N<=10或N=16)进制数 M.求最少通过几步能够获得回文数。若是在30步之内(包含30步)不可能获得回文数,则输出“Impossible” 。blog
【输入】
给定一个N(2<N<=10或N=16)进制数M。ci
【输出】
最少几步。若是在30步之内(包含30步)不可能获得回文数,则输出“Impossible”。string
【输入样例】
9 87
【输出样例】
6
【注意】
- string s; cin>>s; 要加入头文件 #include<string>
- 要注意终止条件,临界的时候,特别是要看看是否是有‘=’;
- 注意有时候处理下一个数的时候,要看清究竟是+=仍是=,不然会致使本来的值被改变
- n进制的计算只须要同位计算以后,用n进制的方法处理该位应该有的数和进位就能够了,不须要所有化为十进制
- 若是两个数是不一样的进制的时候,再考虑用所有化为十进制
【代码】it
#include<iostream> #include<cstring> #include<string> using namespace std; int n, a[101], b[101], ans, i; void initial(int a[]) { string s; cin >> n >> s; //使用cin>>s, s为string类型时,要添加头文件#include<string> a[0] = s.length(); for (int i = 1; i <= a[0]; i++) { if (s[a[0] - i] >= '0'&&s[a[0] - i] <= '9') //注意要从s逆序输入到a数组中,便于加法计算 { a[i] = s[a[0] - i] - '0'; } else a[i] = s[a[0] - i] - 'A' + 10; //注意这里还要加10 } } bool judge(int a[]) //判断是不是回文数,不须要转到十进制再判断 //直接用本来的数比较就能够了 //所以前面转换到a数组的时候 //只须要把a b c...f转成数字便于储存 //而不须要把她们进位 { for (int i = 1; i <= a[0]; i++) { if (a[i] != a[a[0] - i + 1]) return false; } return true; } //n进制的计算,不须要所有化为10进制再计算,再化为n进制 //能够直接每位计算以后,再进行处理 //由于实际上区别是每一位的最大值 //十进制 %10, n进制 %n; //进位 十进制 /10, n进制/n; void Add(int a[]) { b[0] = a[0]; for (int i = 1; i <= a[0]; i++) { b[i] = a[a[0] - i + 1]; } for (int i = 1; i <= a[0]; i++) //注意以1开始,那么终止条件是有等号的,注意终止条件 { a[i] += b[i]; } for (int i = 1; i <= a[0]; i++) //处理进位 { a[i + 1] += a[i] / n; //这里千万要注意!!a[i+1]自己也多是有值的,不能直接覆盖,而是要+= a[i] %= n; } if (a[a[0] + 1] != 0) a[0]++; } int main() { initial(a); if (judge(a)) { cout << 0 << endl; return 0; } ans = 0; while (ans <= 30) { ans++; Add(a); if (judge(a)) { cout << ans << endl; return 0; } } cout << "Impossible" << endl; return 0; }