做为小白,通过一个代码不容易,记录一下
这是蓝桥练习系统的题
时间限制: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的库不是题目的本意,虽然可以通过,等我有空了再研究一下/