2158: G.ly的进制转换
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 77 Solved: 29
[ Submit][ Status][ Web Board]
Description
ly去年有门课叫C语言基础,今年的期末考试上有一道题目是"将16进制的数字39转换成八进制",但是ly并不会算...
在去年考完试之后,发奋学习,并且只学习怎么把16进制的数字转换成八进制...
今年的java考试刚好也有这个问题,但是ly缺忘了怎么算...所以你能帮她吗?
Input
多组数据,第一行一个正整数T表示有T次询问(T<=10)
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数
每个十六进制数长度不超过100000。
Output
输出n行,每行为输入对应的八进制正整数。
Sample Input
139
Sample Output
71
HINT
输入的十六进制数不会有前导0,比如012A。输出的八进制数也不能有前导0。
解析:16进制每个数为4个2进制为,8进制每个数位3个2进制位。所以就可以得到我们先求出16进制的全部2进制位,然后每3个数合成一个8进制位。#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
char a[17]="0123456789ABCDEF";
int main()
{
char s[maxn];
int t;scanf("%d",&t);
while(t--)
{
scanf("%s",s);
int l=strlen(s);
int len=l*4%3;
string ss;
if(len==0)ss+="";
else if(len==1)ss+="00";
else ss+="0";
//cout<<ss<<endl;
for(int i=0; i<l; i++)
{
switch(s[i])
{
case '0':ss+="0000";break;
case '1':ss+="0001";break;
case '2':ss+="0010";break;
case '3':ss+="0011";break;
case '4':ss+="0100";break;
case '5':ss+="0101";break;
case '6':ss+="0110";break;
case '7':ss+="0111";break;
case '8':ss+="1000";break;
case '9':ss+="1001";break;
case 'A':ss+="1010";break;
case 'B':ss+="1011";break;
case 'C':ss+="1100";break;
case 'D':ss+="1101";break;
case 'E':ss+="1110";break;
case 'F':ss+="1111";break;
//default :break;
}
}
for(int i=0; i<ss.length(); i+=3)
{
if(ss[i]=='0'&&ss[i+1]=='0'&&ss[i+2]=='0')
{
if(i==0)continue;
else printf("0");
}
else if(ss[i]=='0'&&ss[i+1]=='0'&&ss[i+2]=='1')printf("1");
else if(ss[i]=='0'&&ss[i+1]=='1'&&ss[i+2]=='0')printf("2");
else if(ss[i]=='0'&&ss[i+1]=='1'&&ss[i+2]=='1')printf("3");
else if(ss[i]=='1'&&ss[i+1]=='0'&&ss[i+2]=='0')printf("4");
else if(ss[i]=='1'&&ss[i+1]=='0'&&ss[i+2]=='1')printf("5");
else if(ss[i]=='1'&&ss[i+1]=='1'&&ss[i+2]=='0')printf("6");
else if(ss[i]=='1'&&ss[i+1]=='1'&&ss[i+2]=='1')printf("7");
}
puts("");
}
return 0;
}