单测试点时限: 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$ 行,每行输入一串只包含 0
和 1
的字符串(无前导 $0$),字符串长度:$1≤length≤10^6$.
输出
对于每组测试样例,输出转化后的十六进制数并单独占一行.
样例
input
output
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; }
|