4月 02, 2009

【解題】Simple Base Conversion

@
ACM Volume CIV 10473 - Simple Base Conversion


The Problem

In this problem you are asked to write a simple base conversion program. You will be given a hexadecimal or decimal integer number as input. You will have to output the corresponding decimal or hexadecimal number. Hexadecimal numbers always starts with a `0x' and all other numbers are to be considered as decimal numbers. There will be no invalid numbers in the input.


Input

The input file contains several lines of input. Each line contains a single non-negative number, which may be a decimal or hexadecimal number as explained in the problem statement. The decimal value of this number will be less than 231. A line containing a negative decimal number terminates input. This number should not be processed. Input numbers will contain no space within them.


Output

For each line of input (Except the last one) produce one line of output. This line should contain the decimal or hexadecimal representation of the corresponding hexadecimal or decimal number. Like the input, the hexadecimal numbers in the output should be preceded by a `0x'.


Sample Input

4
7
44
0x80685
-1


Sample Output

0x4
0x7
0x2C
525957


解題思考

  這一題要求我們做 10 進位(decimal)與 16 進位(hexadecimal)的轉換。


  首先,我們需要直接以字串的方式讀入數字。接著,再根據字串的頭兩個字元,以判斷這個輸入數字的基底。

  若是 16 進位轉 10 進位,則我們只需要將這個 16 進位數字中的每一位數字(其中 A 為 10、B 為 11、以此類推到 F)乘上 16 的位數 - 1 次方,再把得到的結果相加,就是這個 16 進位數字的 10 進位表示法了。

  而若是 10 進位轉 16 進位,則我們首先需要將字串轉成整數型別儲存。轉成整數型別之後,我們將這個數字除以 16,得到的餘數就是這個數字 16 進位表示法的第一位數字。接著,再將這個數字除以 16 的餘數,即為這個數字 16 進位表示法的第二位數字。不斷重覆相同的動作,直到這個數字為 0 為止。

  轉換完成之後,將結果輸出就達成題目要求囉。


參考解答(C++)

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
    while (1)
    {
        string s;
        cin >> s;

        if (s[0] == '-') { break; }

        if (s.length() > 2 && s[0] == '0' && s[1] == 'x' )
        {
            // 將十六進位轉成十進位
            int ans = 0;
            for (int i = 2; i < s.length(); i++)
            {
                ans *= 16;
                if (s[i] >= '0' && s[i] <= '9')
                {
                    ans += s[i] - '0';
                }
                else
                {
                    ans += s[i] - 'A' + 10;
                }
            }

            cout << ans << endl;
        }
        else
        {
            cout << "0x";

            // 將字串轉為數字
            int num = 0;
            for (int i = 0; i < s.length(); i++)
            {
                num = num * 10 + s[i] - '0';
            }

            // 將十進位轉成十六進位
            string ans;
            while (num)
            {
                int r = num % 16;
                num /= 16;

                if (r < 10)
                {
                    ans = static_cast<char>(r + '0') + ans;
                }
                else
                {
                    ans = static_cast<char>(r - 10 + 'A') + ans;
                }
            }

            cout << ans << endl;
        }
    }

#ifndef ONLINE_JUDGE
    system("pause");
#endif

    return 0;
}

0 回覆:

張貼留言