Codeforces #57 (div2) C "Capture Valerian"

問題:http://codeforces.com/problemset/problem/61/C

変換前基数と変換後基数かあるいは文字Rおよび変換前基数で表される数値が与えられる.変換後基数が与えられた場合は数値をその基数で表したもの,文字Rが与えられた場合はローマ数字で表したものを求める.

基数をもとに変換するか,ローマ数字の場合は大きい数字から引いていった文字を追加していく.

コード

import java.util.*;

public class C {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int a = s.nextInt();
		String b = s.next();
		long c = s.nextLong(a);
		if (b.matches("\\d+")) {
			System.out.println(Long.toString(c, new Integer(b)).toUpperCase());
		} else {
			String r = "";
			int[] num = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
			String[] val = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X",
					"IX", "V", "IV", "I" };
			for (; c > 0;) {
				for (int i = 0; i < num.length; ++i) {
					if (c >= num[i]) {
						c -= num[i];
						r += val[i];
						break;
					}
				}
			}
			System.out.println(r);
		}
	}
}