试题 基础练习 十六进制转八进制

举报
夏野了 发表于 2022/02/21 11:02:17 2022/02/21
【摘要】 资源限制时间限制:1.0s   内存限制:512.0MB问题描述  给定n个十六进制正整数,输出它们对应的八进制数。输入格式  输入的第一行为一个正整数n (1<=n<=10)。  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式  输出n行,每行为输入对应的八进制正整数。  【注意】  输入的十六进制数不会...
资源限制
时间限制:1.0s   内存限制:512.0MB
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  【提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。
import java.util.Scanner;

public class _16_8 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();//接受输入行数
		String []a = new String[n];//创建字符串数组用来储存十六位进制数
		for (int i = 0; i < n; i++) {
			a[i]=sc.next();
		}
		sc.close();
		
		for (int i = 0; i < n; i++) {
			String binary =toBinary(a[i]);
			if(binary.length()%3==1) {//二进制转换八进制需要三位三位的转换
				binary = "00"+binary;//所以需要二进制数是3的倍数
			}
			if(binary.length()%3==2) {
				binary = "0"+binary;
			}
			String oct = toOct(binary);//调用 将二进制转换为八进制
			System.out.println(oct);
		}
	}
	
	public static String toBinary(String hex) {//十六进制转为二进制  hex为十六进制的字符串
		
		int len_hex = hex.length();
	    StringBuffer stringBuffer = new StringBuffer();
	    for (int i = 0; i < len_hex; i++) {
	    	switch (hex.charAt(i)) {//逐个检索十六进制数。依次改为二进制数
	    	//stringBuffer将指定的字符串追加到此字符序列。
			case '0':stringBuffer.append("0000");//  这里就是  十六进制和二进制的转换表
				break;
			case '1':stringBuffer.append("0001");
				break;
			case '2':stringBuffer.append("0010");
				break;
			case '3':stringBuffer.append("0011");
				break;
			case '4':stringBuffer.append("0100");
				break;
			case '5':stringBuffer.append("0101");
				break;
			case '6':stringBuffer.append("0110");
				break;
			case '7':stringBuffer.append("0111");
				break;
			case '8':stringBuffer.append("1000");
				break;
			case '9':stringBuffer.append("1001");
				break;
			case 'A':stringBuffer.append("1010");
				break;
			case 'B':stringBuffer.append("1011");
				break;
			case 'C':stringBuffer.append("1100");
				break;
			case 'D':stringBuffer.append("1101");
				break;
			case 'E':stringBuffer.append("1110");
				break;
			case 'F':stringBuffer.append("1111");
				break;

			default:
				break;
			}
	    }
	    return stringBuffer.toString();// 返回二进制数字符串
	}
	
	
	public static String toOct(String binary) {
		int i;
		StringBuffer stringBuffer2 = new StringBuffer();
		//equals首先比较内存地址,如果内存地址是一样的,那么一定相等。如果
	    //不相等,则继续判断是否是String类型,然后进行char数组的一 一 对比
		if (binary.substring(0, 3).equals("000")) {//先检查头三位 是不是000   如果是的话,那么直接从第四位开始
													//题意  头位不能有0
			i = 3;
		}
		else {
			i = 0;
		}
		for ( ; i < binary.length(); i+=3) {
			switch (binary.substring(i, i+3)) {// 三位三位的进行检索
			//substring(int start, int end) 方法,
			//返回一个新的 String,它包含此序列当前所包含的字符子序列。这个子序列是根据 start end 的位置确定的。
			case "000": stringBuffer2.append("0");
				break;
			case "001": stringBuffer2.append("1");
				break;
			case "010": stringBuffer2.append("2");
				break;
			case "011": stringBuffer2.append("3");
				break;
			case "100": stringBuffer2.append("4");
				break;
			case "101": stringBuffer2.append("5");
				break;
			case "110": stringBuffer2.append("6");
				break;
			case "111": stringBuffer2.append("7");
				break;
			

			default:
				break;
			}
		}
		//toString()方法
		//返回此序列中数据的字符串表示形式。
		return stringBuffer2.toString();  //返回 八进制字符串		
	}
}



输出结果

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。