【題目描述】
若一個數(首位不爲零)從左向右讀與從右向左讀都是同樣,咱們就將其稱之爲迴文數。例如:給定一個 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; }