12.基础练习 十六进制转八进制
/*问题描述
给定n个十六进制正整数,输出它们对应的八进制数。输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,
每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。*/
解法一:
//先要把十六进制转为二进制 再把二进制转为八进制 否则会出现0//q先把十六进制转成二进制,每位十六进制正好转成4位二进制,然后再将二进制转成八进制,每三个二进制转成一个八进制。
//但是这种解法在蓝桥杯的练习系统上会运行超时。
import java.util.Scanner;public class Main12 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
String [] s=new String[n];
for(int i=0;i<n;i++){
s[i]=scan.next();
}
for(int i=0;i<n;i++){
bToO(hToB(s[i]));
}
}
static String hToB(String n){
char[] ch=n.toCharArray();
char str;
String s="";
int p=0;
for(int i=0;i<ch.length;i++){
str=ch[i];
if(str>='0'&&str<='9'){
String st=Character.toString(str);
p=Integer.valueOf(st).intValue();//字符串转整型
}else{
if(str=='A'){str=10;}
if(str=='B'){str=11;}
if(str=='C'){str=12;}
if(str=='D'){str=13;}
if(str=='E'){str=14;}
if(str=='F'){str=15;}
p=(int)str;
}
switch(p){
case 0:
s+="0000";
break;
case 1:
s+="0001";
break;
case 2:
s+="0010";
break;
case 3:
s+="0011";
break;
case 4:
s+="0100";
break;
case 5:
s+="0101";
break;
case 6:
s+="0110";
break;
case 7:
s+="0111";
break;
case 8:
s+="1000";
break;
case 9:
s+="1001";
break;
case 10:
s+="1010";
break;
case 11:
s+="1011";
break;
case 12:
s+="1100";
break;
case 13:
s+="1101";
break;
case 14:
s+="1110";
break;
case 15:
s+="1111";
break;
}
}
return s;
}
static void bToO(String n){
int judge=3-(n.length()%3);
String s="";
int sum=0;
if(judge!=0&&judge!=3){
for(int i=0;i<judge;i++){
n="0"+n;
}
}
char[] ch=n.toCharArray();
int[] a=new int[n.length()];
for(int i=0;i<ch.length;i++){
String st=Character.toString(ch[i]);
a[i]=Integer.valueOf(st).intValue();
}
sum=a[0]*4+a[1]*2+a[2];
if(sum!=0) s+=sum;
for(int i=3;i<=a.length-2;i+=3){
sum=a[i+2]*1+a[i+1]*2+a[i]*4;
s+=sum;
}
System.out.println(s);
}
}
解法二:
注意:
1.16转8,由于题目要求制数长度不超过100000,说明是大数问题,所以不能用传统的数学方法
应该先将16转成2进制,然后将2进制转成8进制
2.java不能用String类型,会超出其范围。所以用StringBuffer。要不运行会超时
//此方法已运行通过!
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated methodstub
Scanner sc = newScanner(System.in);
int count = sc.nextInt();
if (count < 1 || count > 10)
return;
StringBuffer shuzu16[] = new StringBuffer[count];
StringBuffer shuzu2[] = newStringBuffer[count];
StringBuffer shuzu8[] = newStringBuffer[count];
StringBuffer shuzu8OUT[] = newStringBuffer[count];
for (int i = 0; i < count; i++) {
StringBuffertemp = new StringBuffer(sc.next());
if (temp.charAt(0) == '0')
return;
if(temp.length() > 100000)
continue;
shuzu16[i] = temp;
}
// 16--->2
for (int i = 0; i < count;i++) {
// 将Stringshuzu[i]转换成2进制的东西
shuzu2[i] =new StringBuffer("");
for (int j =0; j < shuzu16[i].length(); j++) {
shuzu2[i].append(Change16To2(shuzu16[i].charAt(j)));
}
// System.out.println(shuzu2[i]);
}
// 2---->8
for (int i = 0; i < count;i++) {
//从后面每次取三位,做成一个字符串,然后返回其八进制
//如果不够,就添加
shuzu8[i] =new StringBuffer("");
String temp ="";
for (int j =shuzu2[i].length() - 1; j > -2; j = j - 3) {
intthisnum = j - 2;
for(int k = 0; k < 3; k++) {
if(thisnum < 0)
temp+= "0";
else
temp+= shuzu2[i].charAt(thisnum);
thisnum++;
}
// System.out.println(temp);
shuzu8[i].append(Change2To8(temp));
temp = "";
}
}
// 输出
for (int i = 0; i < count;i++) {
shuzu8OUT[i]=newStringBuffer("");
intflag,k;
if(shuzu8[i].charAt(shuzu8[i].length()-1)=='0') k=shuzu8[i].length()-2;
elsek=shuzu8[i].length()-1;
for(;k>=0;k--){
shuzu8OUT[i].append(shuzu8[i].charAt(k));
}
System.out.println(shuzu8OUT[i]);
}
}
private static String Change2To8(String temp) {
if (temp.equals("000"))
return"0";
if (temp.equals("001"))
return"1";
else if(temp.equals("010"))
return"2";
else if(temp.equals("011"))
return"3";
else if(temp.equals("100"))
return"4";
else if(temp.equals("101"))
return"5";
else if(temp.equals("110"))
return"6";
else
return"7";
}
private static String Change16To2(char c) {
// TODO Auto-generated methodstub
if (c == '0')
return"0000";
if (c == '1')
return"0001";
else if (c == '2')
return"0010";
else if (c == '3')
return"0011";
else if (c == '4')
return"0100";
else if (c == '5')
return"0101";
else if (c == '6')
return"0110";
else if (c == '7')
return"0111";
else if (c == '8')
return"1000";
else if (c == '9')
return"1001";
else if (c == 'A')
return"1010";
else if (c == 'B')
return"1011";
else if (c == 'C')
return"1100";
else if (c == 'D')
return"1101";
else if (c == 'E')
return"1110";
else
return"1111";
}
}