kk与cillyb的荣誉之战
发布时间: 2017年5月22日 14:30 最后更新: 2017年5月22日 14:33 时间限制: 1000ms 内存限制: 128M
听说cillyb跟kk要solo了,众所周知cillyb跟kk是冤家一对,他们谁也不服谁,于是cillyb就约战kk再来一场编程solo,kk先发制人给cillyb了一大堆“字符”(字符是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+,空语句等等。 --- 来自百度百科) 叫嚣说:你能把这一堆字符(每个字符的ascll码)用16进制给我输出吗?!结果cillyb抢过键盘,1s就给秒掉了,cillyb说:那我也给你出个简单题,输入的一段字符串,你把这个字符串的长度len给我变成2进制,取后7位,如果除去后七位前边还有1那么就把取出来的7位数在第八位上+1(一共8位数了,第8位是1),然后变成16进制输出,然后将len右移(指的是len的二进制右移)7位,继续上述步骤,(例如10001000100,那么第一次取出来的后七位就是1000100,因为前边还有1,所以第一次取出来的变为11000100,然后将len右移7位得到1000。)最后后面紧接着原始字符串(每个字符的ascll)的16进制把!
kk一下子被惊到了,又要变2进制又要变16进制,只擅长yy的kk怎么会这么吓人的东西,于是就找青岛大学的各位大神们帮助,你们能帮kk解决这个问题并且击败青大手速狗cillyb吗?
第一行输入测试组数t。
之后一段字符串,回车结束( 最多3000000 )
如题意所示
1 42
023432
1 yukkuri shiteitte ne!!!
1779756B6B75726920736869746569747465206E65212121
比赛时候题意未正确理解,也没考虑到len=0,无限WA,菜...
#include <bits/stdc++.h>
using namespace std;
char s[3000005], ans[10];
char to_str[] = {"0123456789ABCDEF"};
int t, tmp, k, tot, len, tlen;
void print(int k) //k最大为255,转为16进制,最多两位,不足两位前位补零
{
ans[0] = ans[1] = '0';
ans[2] = '\0'; tot = 1;
while(k)
{
ans[tot--] = to_str[k%16];
k /= 16;
}
printf("%s", ans);
}
int main()
{
scanf("%d", &t);
getchar();
while(t--)
{
gets(s);
tlen = len = strlen(s);
if(len == 0)
{
printf("00\n");
continue;
}
while(len)
{
tmp = len&127; //1111111
if(tmp != len) tmp += 128;//10000000
print(tmp);
len >>= 7;
}
k = 0;
while(k < tlen)
{
print((int)s[k]);
++k;
}
puts("");
}
return 0;
}
继续加油~