蓝桥杯官网题解——基础训练:进制转换

文章目录

  • 进制转换
    • 16进制转8进制
    • 16进制转10进制
    • 10进制转为16进制
    • 小结
    • 问题
    • 基于Java内置的进制转换函数

进制转换

16进制转8进制

16进制 ——> 2进制,再将2进制——>8进制
蓝桥杯官网题解——基础训练:进制转换_第1张图片

import java.util.Scanner;

public class lanqiao1 {
		public static void main(String[] args) {
			Scanner scanner = new Scanner(System.in);
			int n = scanner.nextInt();
			String[] sts = new String[n+1];
			for(int i=0;i<n;i++){
				sts[i] = scanner.next();
			}
			scanner.close(); //Scanner(System.in)一直在占用资源,使用完毕后要关闭
			for(int i=0;i<n;i++){
				String strBinary = toBinary(sts[i]);
				int len_strBin = strBinary.length();
				if(len_strBin%3==1) strBinary = "00" + strBinary;
				if(len_strBin%3==2) strBinary = "0" + strBinary;
				String strOctal = toOctal(strBinary);
				System.out.println(strOctal);
			}
		}
	    //2进制转为8进制
		private static String toOctal(String strBinary) {
			int len = strBinary.length();
			int k;
			StringBuffer stb = new StringBuffer();
			if(strBinary.substring(0, 3).equals("000")) k=3;
			else k=0;
			for(int i=k;i<len-2;i+=3){
				String string = strBinary.substring(i,i+3);
				if(string.equals("000")) stb.append("0");
				else if(string.equals("001")) stb.append("1");
				else if(string.equals("010")) stb.append("2");
				else if(string.equals("011")) stb.append("3");
				else if(string.equals("100")) stb.append("4");
				else if(string.equals("101")) stb.append("5");
				else if(string.equals("110")) stb.append("6");
				else if(string.equals("111")) stb.append("7");
			}		
			return stb.toString();
		}
	 
	   //16进制转为2进制
		private static String toBinary(String strHex) {
			int len_str = strHex.length();
			StringBuffer stb = new StringBuffer();
			for(int i=0;i<len_str;i++){
				switch (strHex.charAt(i)) {
				case '0': stb.append("0000"); break;
				case '1': stb.append("0001"); break;
				case '2': stb.append("0010");break;
				case '3': stb.append("0011"); break;
				case '4': stb.append("0100"); break;
				case '5': stb.append("0101"); break;
				case '6': stb.append("0110"); break;
				case '7': stb.append("0111"); break;
				case '8': stb.append("1000"); break;
				case '9': stb.append("1001"); break;
				case 'A': stb.append("1010"); break;
				case 'B': stb.append("1011"); break;
				case 'C': stb.append("1100"); break;
				case 'D': stb.append("1101"); break;
				case 'E': stb.append("1110"); break;
				case 'F': stb.append("1111"); break;
				default: break;
				}
			}
			return stb.toString();
		}
	}

16进制转10进制

16进制——>2进制,再将2进制——>10进制
蓝桥杯官网题解——基础训练:进制转换_第2张图片

import java.util.Scanner;
//16进制转10进制
public class lanqiao1 {
		public static void main(String[] args) {
			Scanner scanner = new Scanner(System.in);
			String str = scanner.next();
			scanner.close(); //Scanner(System.in)一直在占用资源,使用完毕后要关闭
			String strBinary = toBinary(str);
		    System.out.print(toDecimal(strBinary)); 
		}
	 
		//2进制转换为10进制
	    public static int toDecimal(String str){
	    	 int res=0;
	    	 for(int i=0;i<str.length();i++)
	    	 { 
	    		 if(str.charAt(i) == '1'){
	    			 int b = str.length()-1 - i;
	    			 res += Math.pow(2, b);
	    		 }   	  
	    	 }
	    	return res;
	    }
	    
	    //16进制转2进制
		private static String toBinary(String strHex) {
			int len_str = strHex.length();
			StringBuffer stb = new StringBuffer();
			for(int i=0;i<len_str;i++){
				switch (strHex.charAt(i)) {
				    case '0': stb.append("0000"); break;
				case '1': stb.append("0001"); break;
				case '2': stb.append("0010");break;
				case '3': stb.append("0011"); break;
				case '4': stb.append("0100"); break;
				case '5': stb.append("0101"); break;
				case '6': stb.append("0110"); break;
				case '7': stb.append("0111"); break;
				case '8': stb.append("1000"); break;
				case '9': stb.append("1001"); break;
				case 'A': stb.append("1010"); break;
				case 'B': stb.append("1011"); break;
				case 'C': stb.append("1100"); break;
				case 'D': stb.append("1101"); break;
				case 'E': stb.append("1110"); break;
				case 'F': stb.append("1111"); break;
				default: break;
				}
			}	
			return stb.toString();
		}
	}

10进制转为16进制

10进制——>2进制,再将2进制——>16进制

import java.util.Scanner;
//10进制转16进制
public class lanqiao1 {
		public static void main(String[] args) {
			Scanner scanner = new Scanner(System.in);
			int dec = scanner.nextInt();
			scanner.close(); 
			String str = toBin(dec);	
			int len = str.length();
			if(len % 4 == 2)  str = "00"+ str;
			if(len % 4 == 1)  str = "000" + str;
			if(len % 4 == 3)  str = "0"+ str;
			System.out.print(toHex(str));
		}


		//2进制转为16进制
		private static String toHex(String string) {
			// TODO 自动生成的方法存根
			StringBuffer temp = new StringBuffer();
			
			for(int i=0;i <= string.length()-4;i+=4){
				String str = string.substring(i, i+4);
				if(str.equals("0000"))   temp.append("0");
				else if(str.equals("0001"))   temp.append("1");
				else if(str.equals("0010"))    temp.append("2");
				else if(str.equals("0011"))     temp.append("3");
				else if(str.equals("0100"))     temp.append("4");
				else if(str.equals("0101"))     temp.append("5");
				else if(str.equals("0110"))     temp.append("6");
				else if(str.equals("0111"))      temp.append("7");
				else if(str.equals("1000"))   temp.append("8");
				else if(str.equals("1001"))   temp.append("9");
				else if(str.equals("1010"))   temp.append("A");
				else if(str.equals("1011"))  temp.append("B");
				else if(str.equals("1100"))  temp.append("C");
				else if(str.equals("1101"))  temp.append("D");
				else if(str.equals("1110"))  temp.append("E");
				else if(str.equals("1111"))  temp.append("F");
			    
			}
			return temp.toString();
		}

		//10进制-->2进制
		private static String toBin(int dec) {
			StringBuffer str = new StringBuffer();
		    int d=-1;
			while(d!=1)
		   {
				int t = dec % 2; 
				str.append(t);
				d = dec / 2; 
				dec = d;
		   }
		    str.append(1);
		    str.reverse();   
			return str.toString();
		}
	}

小结

这几个进制转换我都以2进制为中介,有点麻烦但往下写能顺一些。其中2进制——>8进制和2进制——>16进制的代码差不多是一样的。

问题

10进制转为2进制部分也没考虑小数的转换;
16进制与10进制等一些进制是可以直接转换的也没有写;
由于时间关系后面再补充。

基于Java内置的进制转换函数

利用Integer内置函数

import java.lang.Integer;;
public class lanqiao1 {
		public static void main(String[] args) {
			//10进制 转为 N进制
		    int dec = 45;  //10进制
		    System.out.println(Integer.toHexString(dec));   //转为16进制
		    System.out.println(Integer.toOctalString(dec));  //转为8进制
		    System.out.println(Integer.toBinaryString(dec));  //转为2进制
	        
		    
		    //N进制转化为十进制
		    String n = "101101";
            //方法 1 :Integer.parseInt(String s,int radix)
		    System.out.println(Integer.valueOf(n,2));
            //方法 2 :Integer.valueOf(String s,int radix)  
		    System.out.print(Integer.parseInt(n,2)); 
	    }
}

你可能感兴趣的:(算法)