# String Manipulation# Base Conversion# Conditional Logic

c672 - RGB ⇆ HEX

🔗 前往 ZeroJudge 原題

題目描述

題目要求將 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";
		}
	}
}

Discussion