# Base Conversion# String Manipulation

c009 - 10473 - Simple Base Conversion

🔗 前往 ZeroJudge 原題

題目描述

題目要求將輸入的數字從十進位轉換為十六進位,或從十六進位轉換為十進位。輸入數字可以是十進位或十六進位,十六進位數字以 "0x" 開頭。輸入為負數時結束程式。

解題思路

程式首先讀取輸入字串。如果字串以 "0x" 開頭,則將其視為十六進位數字,並轉換為十進位。否則,將其視為十進位數字,並轉換為十六進位。 十六進位到十進位的轉換:遍歷字串,將每個十六進位字符轉換為其對應的數值,並將其加到總數中,每位數乘以 16 的冪。 十進位到十六進位的轉換:將十進位數字除以 16,直到商為 0。每次除法的餘數是十六進位數字,從低位到高位儲存。如果餘數大於 9,則使用字母 A-F 表示。

複雜度分析

  • 時間複雜度: O(N),其中 N 是輸入字串的長度。
  • 空間複雜度: O(N),用於儲存十六進位轉換後的字串。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    string s;
    while (cin >> s){
        if (s[0]=='-') break;
        if (s[1]=='x'){
            int n=0;
            for (int i=2,si=s.size();i<si;++i){
                n*=16;
                if (s[i] >= 'A')n+=(s[i]-'A')+10;
                else n+=s[i]-'0';
            }
            cout << n << "\n";
        } else {
            int n = 0;
            for (int i = 0,si=s.size(); i < si; ++i){
                n*=10;
                n+=s[i]-'0';
            }
            s = "";
            while (n){
            	int nn=n%16;
                if (nn > 9) s += 'A' + (nn - 10);
                else s += '0' + nn;
                n/=16;
            }
            reverse(s.begin(), s.end());
            cout << "0x" << s << "\n";
        }
    }
    return 0;
}

Discussion