kk与cillyb的荣誉之战
发布时间: 2017年5月14日 17:11 最后更新: 2017年5月19日 11:40 时间限制: 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 复制
1
42
样例输出1
023432
样例输入2 复制
1
yukkuri shiteitte ne!!!
样例输出2
1779756B6B75726920736869746569747465206E65212121
提示
注意审题
模拟的好题 每次看到转进制就晕
16进制和2进制的转化
学长的巧妙代码我偷了过来
把二进制十六进制这种题通通换成整形处理
include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MOD 1000000007
char s[3000005],ans[300];
char str[]={"0123456789ABCDEF"};
void print(int k)
{
int len=0;
for(int i=3;i>=0;i--)ans[i]='0';
while(k)
{
ans[len++]=str[k%16];
k/=16;
}
for(int i=1;i>=0;i--)putchar(ans[i]);
}
int main()
{
int t;
scanf("%d",&t);getchar();
while(t--)
{
int len=0;char c;
while((c=getchar())!='\n'&&c!=EOF)s[len++]=c;
int tlen=len;
if(len==0)
{
puts("00");
continue;
}
while(len)
{
int pos=len&127;
if(pos!=len)pos+=128;
print(pos);
len>>=7;
}
for(int i=0;i<tlen;i++)
{
print((int)s[i]);
}
puts("");
}
return 0;
}