1. 程式人生 > >Vijos 1304題:迴文數

Vijos 1304題:迴文數

描述

若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為迴文數。
例如:給定一個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,其中16進位制數字為0-9與A-F,求最少經過幾步可以得到迴文數。如果在30步以內(包含30步)不可能得到迴文數,則輸出“Impossible!”

格式

輸入格式

共兩行
第一行為進位制數N(2<=N<=10或N=16)
第二行為N進位制數M(0<=M<=maxlongint)

輸出格式

共一行
第一行為“STEP=”加上經過的步數或“Impossible!”

樣例1

樣例輸入1

9
87

樣例輸出1

STEP=6

限制

各個測試點1s

來源

NOIP1999提高組第2題

#include <iostream>
#include <string>

using namespace std;

int radix, n, sum, 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 (int 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 (int i = n; i >= 1; i--) { a[i] = c[i]; } return n; } int main() { cin >> radix >> s; n = s.size(); for (int 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; }