在CSS中我们可以用井号(#)加6位十六进制数表示一种颜色,例如#000000是黑色,#ff0000是红色,#ffd700是金色。
同时也可以将六位颜色#RRGGBB简写为#RGB三位颜色。例如#000与#000000是相同的,#f00与#ff0000是相同的,#639与#663399是相同的。
对于两个颜色#abcdef和#ghijkl,我们定义其距离是(ab - gh)2 + (cd - ij)2 + (ef - kl)2。(其中ab, cd, ef, gh, ij, kl都是十六进制数,也即0~255的整数)
给定一个六位颜色#abcdef,请你求出距离它最近的三位颜色#rgb。
Input#abcdef
其中abcdef是'0'-'9'或'a'-'f'。
Output距离输入颜色最近的#rgb
#40e0d0Sample Output
#4dc
思路:拿10进制来举例子:例如:40,最接近的数字为44或55中的一个,16进制亦是如此。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
char str[100];
char Hex[17]={"0123456789abcdef"};
ll change(char s)
{
if(s>='0'&&s<='9')
{
return s-'0';
}
else if(s>='a'&&s<='f')
{
return 10+s-'a';
}
}
int main()
{
while(~scanf("%s",str))
{
ll a=16*change(str[1])+change(str[2]);
ll b=16*change(str[3])+change(str[4]);
ll c=16*change(str[5])+change(str[6]);
// printf("%lld %lld %lld\n",a,b,c);
ll aa=a/17;//我们要凑的数位16*a+a,即17*a,所aa=a/17;
if(a-aa*17>17*aa+17-a)//这里我们需要比较44 55 离40的大小,即分表为17*aa,a,aa+17;
aa=aa+1; //16*(aa+1)+(aa+1)即是17*aa+17
ll bb=b/17;
if(b-bb*17>17*bb+17-b)
bb=bb+1;
ll cc=c/17;
if(c-cc*17>17*cc+17-c)
cc=cc+1;
if(aa>15) aa=15;
if(bb>15) bb=15;
if(cc>15) cc=15;
printf("#%c%c%c\n",Hex[aa],Hex[bb],Hex[cc]);
}
return 0;
}