java蓝桥练习系统 十六进制转成八进制,十六进制转成十进制,十进制转成十六进制

做为小白,通过一个代码不容易,记录一下
这是蓝桥练习系统的题

时间限制:1.0s 内存限制:512.0MB
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

第一次写的是用十六进制转换成二进制,再转换成八进制,但运行超时
代码如下
/第一次/
import java.util.*;
public class Main {

public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	int n = scanner.nextInt();
	String[] strings = new String[n];
	for(int i = 0;i<n;i++){
		strings[i] = scanner.next();
	}
	for(int i = 0;i<n;i++){
		
		char[] cha = strings[i].toCharArray();
		int len = cha.length;
		String[] str = new String[len];
		for(int j = 0;j<len;j++){
			switch(cha[j]){
			case '0': 
				str[j] = "0000";break;
			case '1':
				str[j] = "0001";break;
			case '2':
				str[j] = "0010";break;
			case '3':
				str[j] = "0011";break;
			case '4':
				str[j] = "0100";break;
			case '5':
				str[j] = "0101";break;
			case '6':
				str[j] = "0110";break;
			case '7':
				str[j] = "0111";break;
			case '8':
				str[j] = "1000";break;
			case '9':
				str[j] = "1001";break;
			case 'A':
				str[j] = "1010";break;
			case 'B':
				str[j] = "1011";break;
			case 'C':
				str[j] = "1100";break;
			case 'D':
				str[j] = "1101";break;
			case 'E':
				str[j] = "1110";break;
			case 'F':
				str[j] = "1111";break;
			}
		}
		String s= str[0];
		for(int j = 1;j<len;j++){
			s += str[j];
		}
		switch(4*len %3){
		case 0:
			break;
		case 1:
			s = "00" +s;
			break;
		case 2:
			s = "0" +s;
			break;
		}
		char[] strr = new char[s.length()/3];
		int m =0;
		for(int x = 0;x<s.length();x+=3){
			String st = s.substring(x, x+3);
			if(st.equals("000")){
				strr[m] = '0';
			}else if(st.equals("001")){
				strr[m] = '1';
			}else if(st.equals("010")){
				strr[m] = '2';
			}else if(st.equals("011")){
				strr[m] = '3';
		    }else if(st.equals("100")){
				strr[m] = '4';
			}else if(st.equals("101")){
				strr[m] = '5';
			}else if(st.equals("110")){
				strr[m] = '6';
			}else if(st.equals("111")){
				strr[m] = '7';
			}
			m++;
		}

		if(strr[0] == '0'){
			for(int j = 1;j<strr.length;j++){
				System.out.print(strr[j]);
			}
			System.out.println();
		}else{
			for(int j = 0;j<strr.length;j++){
				System.out.print(strr[j]);
			}
			System.out.println();
		}
		
	}
}

}

第二次直接用BigInteger的方法将十六进制转换成十进制,再将十进制转换成八进制
可以通过

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	int n = scanner.nextInt();
	String str[] = new String[n];
	for(int i = 0;i<n ;i++){
		str[i] = scanner.next();
	}
	for(int i = 0;i<n;i++){
		System.out.println(chang(str[i],16,8));
	}
	
}
public static String chang(String value,int src,int dest){
	BigInteger bigInteger = new BigInteger(value,src);
	return bigInteger.toString(dest);
}

}

同样的十六进制转十进制,十转十六进制
/十六转十/
import java.math.BigInteger;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	String str = scanner.next();
	BigInteger bigInteger = new BigInteger(str,16);
	System.out.println(bigInteger.toString(10));
}

}

/十转十六/
import java.math.BigInteger;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	String str = scanner.next();
	BigInteger bigInteger = new BigInteger(str,10);
	System.out.println(bigInteger.toString(16).toUpperCase());
}

}
最后将string to 了UpperCase 是因为会转成16进制是小写,蓝桥练习系统不认,所以要改成大写

/我觉得,用java的库不是题目的本意,虽然可以通过,等我有空了再研究一下/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值