qdu 校赛 模拟的好题

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值