XTU1154 Encode 编码
中文题
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1154
一个八位,前三位表示个数,后五位表示字母000 0000, 注意前三位000 表示1个字母 , 后五位00000 表示字母a
由于4位二进制表示一个十六进制.
如:001 00000 表示2个a,即aa,
所以前面的三位只要乘以2就是了,后面的一位在加上就可以了.
如:101 1 知道前三位的十进制为5 ,那么该数为5*2 + 1
而后面的四位则需要减去高位的数字才是后四位数,若高位为1,则减去16(2^4).
如:1 1010 十进制26 - 16 = 10
PS: 9个z是8个z+1个z
View Code
1 /* 2 题目描述 3 行程编码是一种常见的无损压缩方式。比如针对于纯英文小写字符我们可以按以下方式进行编码:每个字节的低5位表示英文小写字母的序号(从0到25),高3位表示此字母连续的次数-1(0到7依次表示连续1到8次)。比如说一个字节的二进制为00100001,其表示字符串bb。给你一个字符串,试将字符串编码为对应的行程编码,并将编码字节的16进制输出。 4 5 输入 6 第一行是一个整数K,表示样例的个数。以后每行是一个待编码的小写英文字母组成的字符串,其长度不超过1000个字符。 7 8 输出 9 每行输出一个编码的16进制数码串(10~15使用a~f表示)。 10 11 样例输入 12 4 13 aabb 14 a 15 aaaaaaaaa 16 zzzzzzzzz 17 18 样例输出 19 2021 20 00 21 e000 22 f919 23 24 */ 25 #include <iostream> 26 #include <string> 27 using namespace std; 28 29 void getnum(char c, int n) 30 { 31 n <<= 1; 32 int m = c - 'a'; 33 if (m > 15) //若高位为1 34 { 35 n += 1; 36 m -= 16; 37 } 38 if (n < 10) 39 cout<<n; 40 else 41 cout<<char('a' + n - 10); 42 n = m; 43 if (n < 10) 44 cout<<n; 45 else 46 cout<<char('a' + n - 10); 47 } 48 49 void show(int cont, char c) 50 { 51 while (cont >8) 52 { 53 cont -= 8; 54 getnum(c, 7); 55 } 56 getnum(c, cont-1); 57 } 58 59 int main() 60 { 61 string str; 62 char c; 63 int i, j; 64 int n; 65 int len, cont; 66 cin>>n; 67 while (n--) 68 { 69 cin>>str; 70 len = str.length(); 71 c = str[0]; 72 cont = 0; 73 for (i=0; i<len; i++) 74 { 75 if (c == str[i]) cont++; //求得相邻字符相同的个数 76 else 77 { 78 // cout<<cont<<" "; 79 show(cont, c); 80 cont = 1; 81 c = str[i]; 82 } 83 } 84 //cout<<cont<<endl; 85 show(cont, c); //注意最后还要判断 86 cout<<endl; 87 } 88 return 0; 89 }