c672 - RGB ⇆ HEX
題目描述
題目要求將 RGB 三元組和十六進制顏色碼互相轉換。輸入可以是 #RRGGBB 格式的十六進制顏色碼,也可以是 R G B 格式的 RGB 值。程式需要根據輸入格式,輸出對應的另一種格式。
解題思路
程式首先判斷輸入字串是否以 # 開頭。如果是,則將其視為十六進制顏色碼,提取 R、G、B 三個部分,並使用 ch 函數將每個十六進制字串轉換為十進制整數,然後輸出。如果輸入字串不以 # 開頭,則將其視為 RGB 值,提取 R、G、B 三個整數,使用 hc 函數將每個十進制整數轉換為十六進制字串,然後輸出 #RRGGBB 格式的顏色碼。
ch 函數將十六進制字串轉換為十進制整數,它遍歷字串中的每個字符,將其轉換為對應的數值(A-F 轉換為 10-15),然後將結果乘以 16 並加上當前字符的數值。
hc 函數將十進制整數轉換為十六進制字串,它計算十進制整數除以 16 的商和餘數,然後將商和餘數轉換為對應的十六進制字符(10-15 轉換為 A-F),並將它們連接起來形成十六進制字串。
複雜度分析
- 時間複雜度: O(1)
- 空間複雜度: O(1)
程式碼
#include <iostream>
using namespace std;
int ch(string b){
int bl=b.length(),tmp=0;
for(int i=0;i<bl;++i){
tmp*=16;
if(b[i]>='A')
tmp+=b[i]-'A'+10;
else
tmp+=b[i]-'0';
}
return tmp;
}
string hc(int b){
int f=b/16,ff=b%16;
string ans;
if(f>=10)
ans+=f-10+'A';
else
ans+=f+'0';
if(ff>=10)
ans+=ff-10+'A';
else
ans+=ff+'0';
return ans;
}
int main(){
string a;
while(cin >> a){
if(a[0]=='#'){
cout << ch(a.substr(1,2)) << " " << ch(a.substr(3,2)) << " " << ch(a.substr(5,2)) << "\n";
}
else{
int aa=0,bb,cc;
for(int i=0,al=a.length();i<al;++i){
aa*=10;
aa+=a[i]-'0';
}
cin >> bb >> cc;
cout << "#" << hc(aa) << hc(bb) << hc(cc) << "\n";
}
}
}