第九届河南理工大学算法程序设计大赛 正式赛 B:Asia区域制

单测试点时限: 1.0 秒

内存限制: 512 MB

二进制数据是用 $0$ 和 $1$ 两个数码来表示的数.它的基数为 $2$ ,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现.
十六进制(简写为hex或下标 $16$ )在数学中是一种逢 $16$ 进 $1$ 的进位制.一般用数字 $0$ 到 $9$ 和字母 $A$ 到 $F$(或 $a$ ~ $f$ )表示,其中: $a$ ~ $f$ 表示 $10$ ~ $15$ ,这些称作十六进制数字.
请将给定的二进制数转为十六进制数,英文字母使用小写形式.

输入

第一行一个正整数 $T$, 代表有 $T$ 组测试数据. $(1≤T≤10)$.
接下来 $T$ 行,每行输入一串只包含 01 的字符串(无前导 $0$),字符串长度:$1≤length≤10^6​$.

输出

对于每组测试样例,输出转化后的十六进制数并单独占一行.

样例

input

1
2
3
2
1
10

output

1
2
1
2

Solve

二进制转换十六进制,从后往前每四位二进制数为一位十六进制数, 注意无前导零,英文字母为小写

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<bits/stdc++.h>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
const int maxn=1e6+10;
const int maxm=1e3+10;
const int inf=(1<<30);
const ll INF=(1LL*1<<60);
using namespace std;
char s[maxn];
int ans[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ms(ans,0);
int cnt=0;
scanf("%s",s);
int l=strlen(s);
int i;
for(i=l-1;i>=0;i-=4)
{
int res=0;
for(int j=0;j<4;j++)
{
if(i<j)
break;
res+=((s[i-j]-'0')<<j);
}
ans[cnt++]=res;
}
if(i)
{
int res=0;
for(int j=i;j>=0;j--)
res+=((s[j]-'0')<<j);
ans[cnt++]=res;
}
int flag=0;
for(int j=cnt-1;j>=0;j--)
{
if(!flag&&ans[j]==0)
continue;
else
flag++;
if(ans[j]>=10)
printf("%c",ans[j]-10+'a');
else
printf("%d",ans[j]);
}
printf("\n");
}
return 0;
}

本文标题:第九届河南理工大学算法程序设计大赛 正式赛 B:Asia区域制

文章作者:执念

发布时间:2019年03月31日 - 21:03

最后更新:2019年04月01日 - 20:04

原始链接:https://blog.wzy1999.wang/solve/hpu-contest-B/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
0%