1220:NUMBER BASE CONVERSION

keyword

n進表記 Java

概要

n進表記で数numが与えられる。これをm進表記で出力せよ。ただし、n, m <=62。
書くだけ…なのにやたら時間がかかった。おまけに何か汚い。

import java.util.*;
import java.math.*;

class Main {


	public static void main(String args[]){
		Scanner in = new Scanner(System.in);
		int rept = in.nextInt();
		for(int loop = 0; loop < rept; loop++){
			if(loop > 0) System.out.println();
			int base = in.nextInt(), to = in.nextInt();
			String num = in.next();
			System.out.println(base + " " + num);
			System.out.println(to + " " + toStr(toBigInt(num, base), to));
		}
	}

	private static BigInteger toNum(char c){
		if(Character.isDigit(c))
			return new BigInteger(new Integer((int)(c-'0')).toString());
		if(Character.isUpperCase(c))
			return new BigInteger(new Integer((int)(c - 'A' + 10)).toString());
		return new BigInteger(new Integer((int)(c - 'a' + 36)).toString());
	}

	private static BigInteger toBigInt(String n, int base){
		BigInteger ret = BigInteger.ZERO, b = BigInteger.ONE;
		for(int i=n.length()-1; i>=0; i--){
			ret = ret.add(toNum(n.charAt(i)).multiply(b));
			b = b.multiply(new BigInteger(Integer.toString(base)));
		}
		return ret;
	}
	
	private static char toCh(int n){
		if(0<=n && n<=9) return (char)(n + '0');
		if(10<=n && n<=35) return (char)(n - 10+ 'A');
		return (char)(n - 36 + 'a');
	}
	
	private static String toStr(BigInteger n, int base){
		if(n.equals(BigInteger.ZERO)) return "0";
		StringBuffer ret = new StringBuffer();
		BigInteger b = new BigInteger(Integer.toString(base)), d = BigInteger.ONE;
		while(!n.equals(BigInteger.ZERO)){
			ret.append(toCh(n.mod(b).intValue()));
			n = n.divide(b);
		}
		for(int i=ret.length()-1; i>=0; i--){
			if(ret.charAt(i)=='0') ret.deleteCharAt(i);
			else break;
		}
		return ret.reverse().toString();
	}
}