在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。
输入
#abcdef
其中abcdef是'0'-'9'或'a'-'f'。
输出
距离输入颜色最近的#rgb
#40e0d0样例输出
#4dc
1 , 将十进制的字符转换为数字
2 ,求该式最小值即求每个单式的最小值
3 ,将(1 , 1) (2 , 2)。。。。(e , e)(f , f)的值存到一个数组里 , 再遍历一遍 , 求公式的最小值
下为代码:
#include <stdio.h>
#include <iostream>
using namespace std;
char hunter[16] = {'0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' ,'c' , 'd' , 'e' , 'f'};
int fun(char ch)
{
if(ch >= '0' && ch <= '9')return (ch - '0');
if(ch >= 'a' && ch <= 'f')return (ch - 'a' + 10);
}
int main()
{
char aa[7];
int ans = 0;
int bb[20] , dd[20] , cc[20];
cin >> aa;
for(int i = 0 ; i < 16 ; i++)
{
bb[i] = 16 * fun(hunter[i]) + fun(hunter[i]);
}
cc[ans++] = 16 * fun(aa[1]) + fun(aa[2]);
cc[ans++] = 16 * fun(aa[3]) + fun(aa[4]);
cc[ans++] = 16 * fun(aa[5]) + fun(aa[6]);
for(int i = 0 ; i < 3 ; i++)
{
int min = 99999;
for(int j = 0 ; j < 16 ; j++)
{
if(min > (cc[i] - bb[j]) * (cc[i] - bb[j]))
{
min = (cc[i] - bb[j]) * (cc[i] - bb[j]);
dd[i] = j;
}
}
}
cout << "#" ;
for(int i = 0 ; i < 3 ; i++)
{
cout << hunter[dd[i]];
}
cout << endl;
return 0;
}