package _2_base;
import java.util.Scanner;
//现在来看,该方法太麻烦,可以直接上BigInteger(见本文最后一个代码实现)
public class _12_16To8_2 {
public static void main(String[] args) {
trans();
}
private static void trans() {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String[] sa=new String[n];
for (int i = 0; i < n; i++) {
sa[i]=sc.next();
sa[i]=toOctal(toBinary(sa[i]));
}
for(String s:sa) {
System.out.println(s);
}
}
private static String toBinary(String strHex) {
StringBuffer sb=new StringBuffer();
int len=strHex.length();
for (int i = 0; i < len; i++) {
switch (strHex.charAt(i)) {
case '0':sb.append("0000");break;
case '1':sb.append("0001");break;
case '2':sb.append("0010");break;
case '3':sb.append("0011");break;
case '4':sb.append("0100");break;
case '5':sb.append("0101");break;
case '6':sb.append("0110");break;
case '7':sb.append("0111");break;
case '8':sb.append("1000");break;
case '9':sb.append("1001");break;
case 'A':sb.append("1010");break;
case 'B':sb.append("1011");break;
case 'C':sb.append("1100");break;
case 'D':sb.append("1101");break;
case 'E':sb.append("1110");break;
case 'F':sb.append("1111");break;
default:break;
}
}
return sb.toString();
}
private static String toOctal(String strBinary) {
StringBuffer sb=new StringBuffer();
int k=0;
int len=0;
len=strBinary.length();
if(len%3==1) {
strBinary="00"+strBinary;
}else if(len%3==2) {
strBinary="0"+strBinary;
}
len=strBinary.length();
if (strBinary.substring(0, 3).equals("000")) {
k=3;
}
for (int i = k; i <=len-3; i+=3) {
String string=strBinary.substring(i, i+3);
if(string.equals("000")) {
sb.append("0");
}else if(string.equals("001")) {
sb.append("1");
}else if(string.equals("010")) {
sb.append("2");
}else if(string.equals("011")) {
sb.append("3");
}else if(string.equals("100")) {
sb.append("4");
}else if(string.equals("101")) {
sb.append("5");
}else if(string.equals("110")) {
sb.append("6");
}else if(string.equals("111")) {
sb.append("7");
}
/*switch (Integer.valueOf(strBinary.substring(i, i+3))) {
case 000: stb.append("0"); break;
case 001: stb.append("1"); break;
case 010: stb.append("2"); break;
case 011: stb.append("3"); break;
case 100: stb.append("4"); break;
case 101: stb.append("5"); break;
case 110: stb.append("6"); break;
case 111: stb.append("7"); break;
default:
break;
}*/
}
return sb.toString();
}
}
package _2_base;
/*
此代码提交数据一个也没有通过,但是给出的样例数据可以通过,虽然如此,还是收获了一个有关字符串的常用方法:substring(求子串)
记住:string(int begin):从角标为begin处截取字串,子串为begin处到最后;
string(int begin,int end):从角标为begin处截取字串,子串为begin处到角标为end的前一个字符(包括begin,不包括end)
System.out.println("Jamaica".substring(1)); ===>amaica
System.out.println("Jamaica".substring(1,3)); ===>am
*/
import java.util.Scanner;
public class _12_16To8 {
public static void main(String[] args) {
jinzhi();
}
private static void jinzhi() {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
sc.close();
String[] s=new String[n];
Long[] la=new Long[n];
for (int i = 0; i <n; i++) {
s[i]=sc.next();
}
for (int i = 0; i < s.length; i++) {
la[i]=Long.parseLong(s[i],16);
s[i]=Long.toOctalString(la[i]);
}
for (int i = 0; i < s.length; i++) {
if(s[i].charAt(0)==0) {
s[i].substring(1);
}
System.out.println(s[i]);
}
}
}
// 2020.2.21发现了新大陆——用BigInteger可以处理大数据间的进制转换问题!!!
//下面的代码运行正确。
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String[] sa=new String[n];
for (int i = 0; i < sa.length; i++) {
sa[i]=sc.next();
}
for (int i = 0; i < sa.length; i++) {
System.out.println(new BigInteger(sa[i],16).toString(8));
}
}
}
总结:进制转换问题碰到大数据的时候往往不好处理,所以会采用字符串的方式将原数转换成二进制再转换成目标进制的方法(是二进制而不是十进制的原因:先转换成十进制也有可能超出数据类型的长度,再者先转成十进制不属于字符串方式),但是于2020年2月21日晚发现了BigInteger类可以对大数据进行处理,故而不用采取字符串方式(即本文的第一个代码实现)就可实现大数据间的进制转换!!!