题目背景
我喜欢安静,你热爱喧闹;我忠于温暖,你酷爱凉爽。
如果任何事物都有反面,那拼接这个世界的颜色呢?
只有白与黑吗?
题目描述
为了形式化地描述颜色,我们引入 RGB 颜色值,用三元组 ( r , g , b ) (r,g,b) (r,g,b) 表示一种颜色,其中 r , g , b r,g,b r,g,b 分别为该颜色的 R 值、G 值、B 值,满足 0 ≤ r , g , b ≤ 255 0 \le r,g,b \le 255 0≤r,g,b≤255 且皆为十进制整数。
显然,这套颜色系统一共可以表示 256 × 256 × 256 = 16 777 216 256 \times 256 \times 256 = 16\,777\,216 256×256×256=16777216 种不同的颜色。对于颜色 ( r , g , b ) (r,g,b) (r,g,b),定义其反色的 RGB 颜色值为 ( 255 − r , 255 − g , 255 − b ) (255-r,255-g,255-b) (255−r,255−g,255−b)。
然而人们发现,单纯地使用 RGB 颜色值很不方便,复制颜色时要复制三个值。
于是诞生了十六进制颜色码,即形如 #EBA932 长度为 77 的字符串。具体而言:
字符串的第一位是 #,为颜色码标识符。
字符串的第二、三位是十六进制数码,拼成的十六进制数等于十进制下所示颜色的 R 值。
字符串的第四、五位是十六进制数码,拼成的十六进制数等于十进制下所示颜色的 G 值。
字符串的第六、七位是十六进制数码,拼成的十六进制数等于十进制下所示颜色的 B 值。
十六进制数码从小到大包含 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,注意 A,B,C,D,E,F 均为大写。
现在你收到了一组十六进制颜色码,请你输出其反色的十六进制颜色码。
提示: 颜色的 RGB 值与十六进制码之间可以相互转换(参考样例解释 #2)
输入格式
一行,输入长度为 7 7 7 的字符串,表示原色的十六进制颜色码。
输出格式
一行,输出长度为 7 7 7 的字符串,表示反色的十六进制颜色码。
输入输出样例
输入 #1
#FFFFFF
输出 #1
#000000
输入 #2
#EBA932
输出 #2复制
#1456CD
说明/提示
【样例解释 #1】
转换后原色的 RGB 值为 ( 255 , 255 , 255 ) (255,255,255) (255,255,255),反色的 RGB 值为 ( 0 , 0 , 0 ) (0,0,0) (0,0,0),对应十六进制码 #000000。
【样例解释 #2】
转换后原色的 RGB 值为 ( 235 , 169 , 50 ) (235,169,50) (235,169,50),反色的 RGB 值为 ( 20 , 86 , 205 ) (20,86,205) (20,86,205),对应十六进制码 #1456CD。
为避免理解偏差,此处特别解释 #EBA932 转换后 B 值为 50 50 50 的原因:提取字符串的第六、七位,拼成的十六进制数为 ( 32 ) 16 (32)_{16} (32)16,则有 ( 32 ) 16 = 3 × 1 6 1 + 2 × 1 6 0 = 50 (32)_{16} = 3 \times 16^1 + 2 \times 16^0 = 50 (32)16=3×161+2×160=50。
【数据规模与约定】
本题共有 10 个测试点,每通过一个测试点可获得 10 points。
对于 10 % 10\% 10% 的数据,为样例 #1。
对于另外 30 % 30\% 30% 的数据,输入与输出字符串均不包含大写字母。
对于所有的数据,保证给定字符串为合法十六进制颜色码。
解题思路
非常暴力模拟的一题, 一开始输出处理错了, 后来改成了非常粗暴的方式就过了
Code
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
string s;
map<char,int>f;//zzl熟悉地捡起了熟悉的map
const char k[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
int x;
int main(){
cin >> s;
for (int i = 0; i <= 9; i++)
{
char c = i + 48;
f[c] = i;
}
f['A'] = 10, f['B'] = 11, f['C'] = 12, f['D'] = 13, f['E'] = 14, f['F'] = 15;
//预处理出换算
printf ("#");
for (int i = 1; i < s.size(); i++)
{
x = x * 16 + f[s[i]];
if (i % 2 == 0)
{
x = 255 - x;
cout << k[x / 16 % 16] << k[x % 16];
x = 0;
}
}
}