二进制转化为十六进制
时间限制: 3 Sec 内存限制: 64 MB提交: 433 解决: 45
[ 提交][ 状态][ 讨论版]
题目描述
输入一个2进制的数,要求输出该2进制数的16进制表示。 在16进制的表示中,A-F表示10-15
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是10000
输出
n行,每行输出对应一个输入。 输出没有前导的0。
样例输入
2100000111
样例输出
207
提示
来源
这题的实现不难,只是要注意一下变态的数据,输入00000时应该输出0,要是漏了这步就会变为00就会Wa。
二进制化十六进制直接拿二进制的四位就是十六进制的一位。
AC代码:
#include <iostream>
#include <cstring>
using namespace std;
const int t=20000000;
char a[t],b[t];
int val(int j)
{
int sum=0,k=j-4;
if(j-4<0)k=0;//相当于不够四位的补位操作
for (int i=k;i<j;i++) //二进制四位转十进制的数
{
if (a[i]=='0')
{
sum*=2;
}
else
{
sum=sum*2+a[i]-'0';
}
}
return sum;
}
int main()
{
int n=2,tt,m=15,i,j,len,f;
cin >> f;
cin.get();
while(f--)
{
cin.getline(a,t);
len=strlen(a);
j=0;
while(len>=4)
{
tt=val(len);
if(tt>=0&&tt<=9)//转十六进制
b[j++]=tt+'0';
else
b[j++]=tt+55;
len-=4;
}
if(len)//还有小于四位的二进制数
b[j++]=val(len)+'0';
len=j-1;
while(b[len]=='0'&&len>0)//排除多个0的情况
{
len--;
}
for(i=len;i>=0;--i)
{
cout << b[i];
}
cout << endl;
}
return 0;
}