@javaブルーブリッジ・カップ・グループBの運動の基礎(30)質問12:六角ターン進
問題の説明
正の整数N進与え、オクタルその出力は対応しています。
入力形式の
入力が最初に正の整数Nに作用する(1 <= N <= 10)。
次のn行、0からの各ラインA 9、大文字のAを 16進数に変換Fからなる文字列は、正の整数を表し、各進数の長さ100,000を超えません。
出力フォーマット
出力n行、進正の整数に対応する各行為入力。
[注]
16進数を入力は、012Aとして、0をリードしていません。
進数も先行ゼロを持つことはできません。
サンプル入力
2
39
123ABC
サンプル出力
71がある
4435274
[注]
第一進数に16進数を変換し、進バイナリ数で変換されます。
コード:
(この質問は、私は、正しい答えをすることができませんでしたが、私は、オンラインで書くために兄を見つけ、評価結果の提出が共有への皆のためにここに出ている後、あなたもああ〜、元の兄を見ることができます!)
インポートjava.util.Scanner;
輸入java.util.Stackを;
パブリッククラスHexadecimalConversionToOctal {
静的な文字列convert16To2(チャーC){
int型のTEMP = C> = 'A'?C - 'A' + 10:C - '0'。
INT [] A =新たINT [4]。
私は0を= int型。
用(; I <a.length; I ++){
[I] = TEMP%2。
TEMP / = 2。
}
I-。
StringBufferのSB =新しいStringBufferを();
(; I> = 0; I-){ため
sb.append([I])。
}
)(sb.toStringを返します。
}
static String convert2To8(String str) {
int result = 0;
for (int i = 0; i < str.length(); i++) {
result += Math.pow(2, str.length() - 1 - i) * (str.charAt(i) - '0');
}
return result + "";
}
static void convert16To8(String n) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < n.length(); i++) {
sb.append(convert16To2(n.charAt(i)));// 把16进制数的每一位转换成四位2进制数字
}
Stack<String> stack = new Stack<>();
for (int i = sb.length(); i >= 0; i -= 3) {
int start = i - 3 >= 0 ? i - 3 : 0;
String temp = sb.substring(start, i);
stack.add(convert2To8(temp));// 从后向前每三位2进制数字转换成一位8进制数字,存储在栈中。
}
while (stack.peek().equals("0")) {
stack.pop();// 删除前面的多余的0
}
while (!stack.isEmpty()) {
System.out.print(stack.pop());
}
System.out.println();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] strings = new String[n];
for (int i = 0; i < n; i++) {
strings[i] = sc.next();
}
for (String string : strings) {
if (string.equals("0")) {
System.out.println(0);
} else {
convert16To8(string);
}
}
}
}