上海交通大學計算機研究生複試題——迴文數
阿新 • • 發佈:2018-11-11
問題 C: 迴文數
時間限制: 1 Sec 記憶體限制: 128 MB
題目描述
若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為迴文數。
例如:給定一個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),表是這個數的進位制;
第二行是N進位制數M(100位之內),求最少經過幾步可以得到迴文數。
輸出
若最少在30步以內得到迴文數,則輸出步數;
如果在30步以內(包含30步)不可能得到迴文數,則輸出“Impossible”(無引號)
樣例輸入
10
87
樣例輸出
4
提示
十六進位制的10-15用A-F表示
c++程式碼如下:
#include <iostream> #include <string> using namespace std; int radix, n,i, sum=0, a[1001]; string s; //判斷是否是迴文數 bool palindromic(int n) { for (int i = 1; i <= n / 2; i++) if (a[i] != a[n - i + 1]) return false; return true; } //兩數相加 int add(int n) { int c[1001] = { 0 };//定義臨時陣列,表示兩數的和 for (i = 1; i <= n; i++)//進位制數相加 { c[i] = a[i] + a[n - i + 1] + c[i]; c[i + 1] += c[i] / radix; c[i] %= radix; } if (c[n + 1])//保留進位 n++; for (i = n; i >= 1; i--) { a[i] = c[i]; } return n; } int main() { cin >> radix >> s; n = s.size(); for (i = 1; i <= n; i++)//將字串轉化為整數陣列 { if (s[i - 1] < 65) a[i] = s[i - 1] - '0'; else a[i] = s[i - 1] - 55; } while (sum <= 30) { if (palindromic(n)) { cout << "STEP=" << sum << endl; return 0; } sum++; n = add(n); } cout << "Impossible!" << endl; return 0; }