1. 程式人生 > >上海交通大學計算機研究生複試題——迴文數

上海交通大學計算機研究生複試題——迴文數

問題 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;
}