進進からの基本的な演習
リソースの制約
制限時間:メモリ制限が1.0S:512.0メガバイト
問題の説明
正の整数N進与え、オクタルその出力は対応しています。
入力形式
第一幕入力の正の整数N(1 <= N <= 10)。
次のn行、0からの各ラインA 9、大文字のAを 16進数に変換Fからなる文字列は、正の整数を表し、各進数の長さ100,000を超えません。
出力フォーマット
N本の出力線は、各行為入力進正の整数対応します。
[注]
16進数を入力は、012Aとして、0をリードしていません。
進数も先行ゼロを持つことはできません。
サンプル入力
2
39
123ABC
サンプル出力
71
4435274
[注]
第一進数に16進数を変換し、進バイナリ数で変換されます。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String str="";
String bs1="";
StringBuilder stringBuilder ;//二进制字符串
StringBuilder stringBuilderO ;//逆序的八进制字符串
StringBuilder stringBuilderRes ;//正序的八进制字符串
int n=scanner.nextInt();
List listSL=new ArrayList<StringBuilder>();//十六进制
List listB=new ArrayList<StringBuilder>();//二进制
for(int i=0;i<n;i++) {
listSL.add(scanner.next());
}
for(int i=0;i<n;i++) {
str=""+listSL.get(i);//题目要求每个十六进制数长度不超过100000
//测试用例里,必然有一个100000长度的十六进制数
//然而程序并没有出现异常,可猜测String能存储的字符长度应该是大于10万的
//System.out.println("str "+str);
stringBuilder= new StringBuilder();
for(int j=0;j<str.length();j++) {
bs1 = Integer.toBinaryString(Integer.valueOf(str.charAt(j)+"", 16));
//借助了java自带的短字符串16进制转二进制,只能转短的,太长不行,所以这里一个一个十六进制转
// System.out.println(bs1);
while(bs1.length()<4&&j!=0) {
bs1="0"+bs1;
}
//要保证一个十六进制输出为4位二进制,但如果字符串只有一位十六进制的话,最前面是不能有0的,如果j为0这里就不进入循环
stringBuilder.append(bs1);
//拼接成长长的二进制字符串
}
int numtmp=0;int value=0,valuetmp;//valuetmp用于存储中间值
stringBuilderO=new StringBuilder();//用于装载八进制字符串
for(int En=stringBuilder.length()-1;En>=0;En--) {
// System.out.println();
valuetmp =Integer.parseInt(stringBuilder.charAt(En)+"")*(int)Math.pow(2, numtmp);
//System.out.println(valuetmp);
value+=valuetmp;
numtmp++;
if(numtmp%3==0) {
//System.out.println("---------");
//System.out.println(value);
stringBuilderO .append(value);
numtmp=0;
value=0;
}
}
if(numtmp!=0) {
stringBuilderO .append(value);
}//
//因为二进制转八进制是从后每3位转一位八进制所以这里拼接完后是逆序的
stringBuilderRes=new StringBuilder();//现在把他调序
for(int strO=stringBuilderO.length()-1;strO>=0;strO--) {
stringBuilderRes .append(stringBuilderO.charAt(strO));
}
listB.add(stringBuilderRes);
}
//输出各对应的八进制值
for(int i=0;i<n;i++) {
System.out.println(listB.get(i));
}
}
}