基礎訓練5-進数変換

6160 ワード

しんしんへんかん
①十進法16進法
問題の説明
16進数は、プログラム設計時によく使われる整数の表現です.0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,Fの16シンボルで,それぞれ10進数の0から15を表す.16進数のカウント方法は満16進1であるため、10進数16は16進数で10であり、10進数の17は16進数で11であり、このように10進数の30は16進数で1 Eである.非負の整数を与え、16進数の形式で表す.
入力フォーマット
入力には、変換する数を表す非負の整数aが含まれます.0<=a<=2147483647
出力フォーマット
この整数の16進数表現を出力します
サンプル入力
30
サンプル出力
1E
 
import java.util.Scanner;

public class Main {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		System.out.println(Integer.toString(n, 16).toUpperCase());
	}
}

 
 
②16進数から10進数へ
問題の説明
キーボードから8桁以下の正の16進数文字列を入力し、正の10進数に変換して出力します.注:16進数の10~15は、それぞれ大文字のアルファベットA、B、C、D、E、Fで表されます.
サンプル入力
FFFF
サンプル出力
65535
 
import java.util.Scanner;

public class Main {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine();
        System.out.println(Long.toString(Long.valueOf(str, 16), 10));
	}
}

 
③16進数から8進数へ
 
問題は、与えられたn個の16進数の正の整数を記述し、対応する8進数を出力する.入力フォーマット入力の第1の動作は、正の整数n(1<=n<=10)である.次のn行は、1行あたり0~9、大文字A~Fからなる文字列で、変換する16進数の正の整数を表し、各16進数の長さは100000を超えない.出力フォーマットはn行を出力し、動作ごとに対応する8進正整数を入力します.【注意】入力された16進数には、012 Aなどのプリアンブル0はありません.出力される8進数にも先頭0はありません.サンプル入力2 39 123 ABCサンプル出力71 4435274【ヒント】16進数をある進数に変換し、ある進数から8進数に変換します.
 
各16進数の長さが100000を超えないことを規定しているため、longの長さを超えていることは明らかであるため、既存のAPIライブラリ関数を使用してこの問題を解決することはできません.そのため、手動で進数変換コードを書かなければなりません.
16進数は8進数に変換され、1つの16進数は4桁のバイナリで表され、1つの8進数は3桁のバイナリで表されることが知られています.では、まず16進数を2進数に変換し、8進数に変換します.
 
では、16進数を2進数に変換するにはどうすればいいのでしょうか.
問題に規定された16進数テストのデータは大きいので、Stringタイプでこの16進数を保存することができます.
16進数変換バイナリコードを見てみましょう
public static String toBinary(String str){
		StringBuffer stb = new StringBuffer();
		int length = str.length();
		for (int i = 0; i < length; i++){
			switch(str.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;	
			}
		}
		return stb.toString();
	}

 
2進法は8進法で同じですが、2進数の長さが3の倍数かどうか、そうでない場合は0で揃える必要があることに注意してください.その後、そのバイナリ数の上位3桁が000であるかどうかを判断し、もしそうであればスキップする必要があります
	public static String toOctal(String str){
		StringBuffer stb = new StringBuffer();
		int length = str.length();
		int k = 0;
		if (length % 3 == 1)
			str = "00" + str;
		else if (length % 3 == 2)
			str = "0" + str;
		if (str.substring(0, 3).equals("000"))
			k = 3;
		for (; k < length; k += 3){
			switch(str.substring(k, k + 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;
			}
		}
		return stb.toString();
	}

完全なコード
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		String[] strArr = new String[n];
		for (int i = 0; i < n; i++)
			strArr[i] = sc.next();
		for (int i = 0; i < n; i++){
			strArr[i] = toBinary(strArr[i]);
			System.out.println(toOctal(strArr[i]));
		}
	}
	
	public static String toOctal(String str){
		StringBuffer stb = new StringBuffer();
		int length = str.length();
		int k = 0;
		if (length % 3 == 1)
			str = "00" + str;
		else if (length % 3 == 2)
			str = "0" + str;
		if (str.substring(0, 3).equals("000"))
			k = 3;
		for (; k < length; k += 3){
			switch(str.substring(k, k + 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;
			}
		}
		return stb.toString();
	}
	
	public static String toBinary(String str){
		StringBuffer stb = new StringBuffer();
		int length = str.length();
		for (int i = 0; i < length; i++){
			switch(str.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;	
			}
		}
		return stb.toString();
	}
}