c009 - 10473 - Simple Base Conversion
題目描述
題目要求將輸入的數字從十進位轉換為十六進位,或從十六進位轉換為十進位。輸入數字可以是十進位或十六進位,十六進位數字以 "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;
}