
國立清X大學藝X學院學士班的某位助教,最近正在修習計算機結構。
某天,他盯著滿頁的記憶體位址: 0xFFFFFFFF 看著看著,突然覺得哪裡不太對勁……
這不是很像色票嗎?
一查才發現,在 32-bit 系統中,記憶體位址可以使用 8 位十六進位數表示;
而加入透明度(Alpha)的 RGBA 色碼 #RRGGBBAA,也正好可以使用 8 位十六進位數表示!
然而,助教在整理同學們交上來的網頁設計作業時發現,大家打字習慣都不太一樣——
有人喜歡大寫(如 #FFFFFFFF),有人習慣小寫(如 #ffffffff),
甚至有人會大小寫混用(如 #0232202a 或 #Ff00aB12)!
十六進位使用以下符號表示數值(英文字母不分大小寫):
0 1 2 3 4 5 6 7 8 9 A(a) B(b) C(c) D(d) E(e) F(f)
其中:
A 或 a = 10
B 或 b = 11
C 或 c = 12
D 或 d = 13
E 或 e = 14
F 或 f = 15
一個 RGBA 色碼可以表示為:
#RRGGBBAA 每一個色彩通道皆由 2 位十六進位數字組成。
假設其中一個通道的兩位十六進位數字分別為 x 與 y,
則其十進位數值可以使用以下公式計算:x × 161 + y × 160
也就是:x × 16 + y
Hint: 161 = 16, 160 = 1
例如,給定大小寫混合的色碼: #0232202a 可以拆成:
02 32 20 2a
R G B A
其中小寫 a 所代表的數值同樣為 10,各通道分別計算為:
R = 0*16+2=2
G = 3*16+2=50
B = 2*16+0=32
A = 2*16+10=42
因此,此色碼所代表的 RGBA 數值為:
R = 2
G = 50
B = 32
A = 42
現在給定一組可能包含大小寫英文字母的 RGBA 十六進位色碼 s,請將其中的 R、G、B、A 四個通道分別轉換成十進位數值。
輸入一行,包含一組 RGBA 色碼:
s 的格式固定為:
#RRGGBBAA
其中:
第一個字元固定為 #。
後面共有 8 個十六進位字元。
每個十六進位字元皆為 0 到 9、A 到 F 或 a 到 f。
注意:本題輸入的英文字母可能為大寫或小寫。
輸出一行,依序輸出 R、G、B、A 四個通道轉換後的十進位數值,數字之間以一個空白分隔。
請務必在輸出結果後加上換行字元 \n。
例如: 255 255 255 255
十六進位中的 A~F 以及 a~f 分別代表十進位的 10、11、12、13、14、15。
每兩個十六進位字元代表一個色彩通道:#RRGGBBAA。
若兩位十六進位數字的數值分別為 x 與 y,則其十進位數值為:x*161+y*160。
可以將色碼以 char array 儲存,再分別讀取對應位置的字元。
若字元 c 介於 '0' 到 '9',可以使用 c - '0' 取得其數值。
若字元 c 介於 'A' 到 'F',可以使用 c - 'A' + 10 取得其數值。
若字元 c 介於 'a' 到 'f',可以使用 c - 'a' + 10 取得其數值。
不需要使用任何內建的進位轉換函式。