十六进制转八进制

今天刷蓝桥杯的题目时碰到了十六进制转八进制的题目,耗了我两个小时才做出来,虽然没有别人写的精炼并且行数少,但是这是我自己实打实的,自己的思路,我们先来看一下题目

在这里插入图片描述

一开始看提示以为是十六进制转换成二进制,再转换成八进制(想了半个小时也没思路),后来我想起来老师讲过这种2的阶乘转换成2进制再转换成别的进制将简单多了,后来我也是这么做的,

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String a = scan.nextLine();
		List list = new ArrayList<String>();
		for(int i = 0; i < Integer.parseInt(a); i++){
			StringBuffer sb ;
			String b = scan.nextLine();
			//把字符串转换成一串0 1的数
			char[] c = b.toCharArray();
			String [] g = new String[c.length];
			for(int j = 0; j < c.length;j++){
			if(c[j]=='A'){
				g[j] = "1010";
			}else if(c[j]=='B'){
				g[j] = "1011";
			}else if(c[j]=='C'){
				g[j] = "1100";
			}	else if(c[j]=='D'){
				g[j] = "1101";
			}	else if(c[j]=='E'){
				g[j] = "1110";
			}else if(c[j]=='F'){
				g[j] = "1111";
			}else if(c[j]=='0'){
				g[j] = "0000";
			}	else if(c[j]=='1'){
				g[j] = "0001";
			}	else if(c[j]=='2'){
				g[j] = "0010";
			}	else if(c[j]=='3'){
				g[j] = "0011";
			}	else if(c[j]=='4'){
				g[j] = "0100";
			}	else if(c[j]=='5'){
				g[j] = "0101";
			}	else if(c[j]=='6'){
				g[j] = "0110";
			}	else if(c[j]=='7'){
				g[j] = "0111";
			}	else if(c[j]=='8'){
				g[j] = "1000";
			}
			else if(c[j]=='9'){
				g[j] = "1001";
			}	
			}
			sb = new StringBuffer();
			for(int j = 0; j < c.length;j++){
				sb.append(g[j]);
			}
			//判断是否成3的倍数,不够就添加0
			int y = sb.length()/3;
			int u = sb.length()%3;
			if(u==1){
				sb.insert(0, "00");
				y++;
				
			}else if(u==2){
				sb.insert(0, "0");
				y++;
			}
			StringBuffer sb1 = new StringBuffer();
			for(int j =0; j < y;j++){
				String  q =sb.substring(j*3,j*3+3);
			
				if(q.equals("000")){
					sb1.append("0");
				}else if(q.equals("001")){
					sb1.append("1");
				}else if(q.equals("010")){
					sb1.append("2");
				}else if(q.equals("011")){
					sb1.append("3");
				}else if(q.equals("100")){
					sb1.append("4");
				}else if(q.equals("101")){
					sb1.append("5");
				}else if(q.equals("110")){
					sb1.append("6");
				}else if(q.equals("111")){
					sb1.append("7");
				}
				
			}
			//从头开始删除第一个数为零的情况,直到第一个不是零跳出,
	for(int j = 0; j < 3; j++){
				if(sb1.substring(j,j+1).equals("0")){
					sb1.delete(j, j+1);
				}else{
					break;
				}
			}
		list.add(sb1);
	
		}
		for(int i = 0; i < Integer.parseInt(a); i++){
			System.out.println(list.get(i));
			
		}
	
	}
}

因为这几天我正在学习《java编程思想第四版》上面有转进制的,一开始我没想,那个转进制的给忘了,后来我看了,也用了,但是由的结果会报错,我就在网上查了,原来是长度不大于100000,long类型肯定没有那么多啊,肯定是出题人出这个题就想到了不让你用转进制的方法,让你自己编写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值