基礎訓練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
②16進数から10進数へ
問題の説明
キーボードから8桁以下の正の16進数文字列を入力し、正の10進数に変換して出力します.注:16進数の10~15は、それぞれ大文字のアルファベットA、B、C、D、E、Fで表されます.
サンプル入力
FFFF
サンプル出力
65535
③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進数変換バイナリコードを見てみましょう
2進法は8進法で同じですが、2進数の長さが3の倍数かどうか、そうでない場合は0で揃える必要があることに注意してください.その後、そのバイナリ数の上位3桁が000であるかどうかを判断し、もしそうであればスキップする必要があります
完全なコード
①十進法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();
}
}