您的位置:首页 > 其它

蓝桥杯 12 基础练习 十六进制转八进制

2018-03-18 17:22 399 查看
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
;
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";
 }}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: