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(); } }