试题 基础练习 十六进制转八进制
“蓝桥杯”练习系统 (lanqiao.cn)试题 基础练习 十六进制转八进制
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0-9、大写字母A-F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入 | 样例输出 |
---|---|
2 39 123ABC | 71 4435274 |
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
思路
由于数据量较大,考虑每三位16进制值可以作为4位8进制值进行输出,因此先将16进制每三位按顺序压位存储到队列,从头至尾输出队列中保存的数据即为最终整个数的8进制值。注意处理队列头的第一次数据(无前导零且不一定是三位16进制输入)。
import java.util.*;
import java.math.*;
public class Main {
public static void tr16(String s) {
Queue q=new LinkedList();
int val=0,detc=0;
int len=s.length()%3;
for(int i=0;i<len;i++) {//首次处理
val<<=4;
if(s.charAt(i)>='0'&&s.charAt(i)<='9')
val+=s.charAt(i)-'0';
else
val+=s.charAt(i)-'A'+10;
}
if(len>0)
q.offer(val);
val=0;
for(int i=len;i<s.length();i++) {//三位循环处理
detc++;
val<<=4;
char c=s.charAt(i);
if(c>='0'&&c<='9')
val+=c-'0';
else
val+=c-'A'+10;
if(detc%3==0) {
q.offer(val);
val=0;
}
}
System.out.printf("%o", q.element());
q.poll();
while(q.isEmpty()==false) {//输出队列中的8进制整数
System.out.printf("%04o", q.element());
q.poll();
}
System.out.println();
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
while(a-->0) {
tr16(sc.next());
}
}
}