DevQuizを解いた。

漢字サーバの問題も解きました。
問題だけ見たときは一番難しいと思ってたけど、実際はパッチワークの方が難しかったかな。

/* 数字を漢数字に変換するアプリケーションを作ってください。
 * 
 * http://[あなたのアプリケーションのURL]?n=[数字] にアクセスすると、 
 * text/plain でその数字を漢数字に変換した結果を返すウェブサーバを作ってください。 
 * ただし、漢字はすべて以下の表の通りにアルファベットに変換して出力してください。
 * 
 *     * 零 → J
 *     * 一 → E
 *     * 二 → Q
 *     * 三 → H
 *     * 四 → N
 *     * 五 → L
 *     * 六 → D
 *     * 七 → G
 *     * 八 → Z
 *     * 九 → X
 *     * 十 → B
 *     * 百 → F
 *     * 千 → P
 *     * 万 → C
 *     * 億 → M
 *     * 兆 → A
 * 
 * 注意:
 * 
 *     * 「千万」「千億」「千兆」の前に「一」がつかないようにしてください。
 *     * 入力は負でない整数で、大きさは高々9999兆9999億9999万9999までです。
 *     * 標準のポート番号80番のみ扱えます。
 **/

public class NumToKanji{

  private static final long CHO = (long)Math.pow(10, 12);
  private static final long OKU = (long)Math.pow(10, 8);
  private static final long MAN = (long)Math.pow(10, 4);
  private static final String[] KANJI_NUM_LIST = {"零","一","二","三","四","五","六","七","八","九","十","百","千","万","億","兆"};
  private static final String[] CODE_LIST = {"J","E","Q","H","N","L","D","G","Z","X","B","F","P","C","M","A"};

  public NumToKanji(){
  }

  public static void main(String[] args) throws Exception {
    
    for(int i=0;i<100000;i++){
      long n = (long)(Math.random() * Math.pow(10, Math.random() * 16));
      
      NumToKanji numToKanji = new NumToKanji();
      String answer1 = numToKanji.execute(n);
      System.out.println(answer1);
      
      String answer3 = ToKanjiNumConverter.toAlphaReps(ToKanjiNumConverter.toKanjiNum(n));
      System.out.println(answer3);
      
      if(!answer1.equals(answer3)){
        throw new Exception();
      }
    }
  }

  public String execute(long n){
    // 零
    if(n == 0){
      return "J";
    }
    
    // 兆・億・万・端数に分ける
    int[] nums = resolveNum(n);
    
    // それぞれを漢数字に変換する
    String hasu = convertKanjiNum(nums[0]);
    String man = convertKanjiNum(nums[1]);
    String oku = convertKanjiNum(nums[2]);
    String cho = convertKanjiNum(nums[3]);
    
    // くっつける
    StringBuffer buffer = new StringBuffer();
    if(cho.length() > 0){
      buffer.append(cho).append("兆");
    }
    if(oku.length() > 0){
      buffer.append(oku).append("億");
    }
    if(man.length() > 0){
      buffer.append(man).append("万");
    }
    if(hasu.length() > 0){
      buffer.append(hasu);
    }
    
    // 漢数字をアルファベットに変換する
    String answer = encode(buffer.toString());
    
    return answer;
  }
  
  /**
   * 数値を各桁に分解する
   * 配列に入っている情報は、「端数・万・億・兆」の順番で入ってる 
   */
  public int[] resolveNum(long num){
    int[] nums = new int[4];
    nums[0] = (int)(num % 10000);
    nums[1] = (int)(((num - (num % MAN)) / MAN) % 10000);
    nums[2] = (int)(((num - (num % OKU)) / OKU) % 10000);
    nums[3] = (int)(((num - (num % CHO)) / CHO) % 10000);
    return nums;
  }
  
  /**
   * 4桁に限り数値を漢数字に変換する
   */
  public String convertKanjiNum(long num){
    int[] nums = new int[4];
    nums[0] = (int)(num % 10); // 端数
    nums[1] = (int)(((num - (num % 10)) / 10) % 10); // 十の位
    nums[2] = (int)(((num - (num % 100)) / 100) % 10); // 百の位
    nums[3] = (int)(((num - (num % 1000)) / 1000) % 10); // 千の位
    
    StringBuffer buffer = new StringBuffer();
    
    // 千の位を漢数字に変換する
    if(nums[3] > 0){
      if(nums[3] > 1){
        buffer.append(KANJI_NUM_LIST[nums[3]]);
      }
      buffer.append("千");
    }
    
    // 百の位を漢数字に変換する
    if(nums[2] > 0){
      if(nums[2] > 1){
        buffer.append(KANJI_NUM_LIST[nums[2]]);
      }
      buffer.append("百");
    }
    
    // 十の位を漢数字に変換する
    if(nums[1] > 0){
      if(nums[1] > 1){
        buffer.append(KANJI_NUM_LIST[nums[1]]);
      }
      buffer.append("十");
    }
    
    // 端数を漢数字に変換する
    if(nums[0] > 0){
      buffer.append(KANJI_NUM_LIST[nums[0]]);
    }
    
    
    return buffer.toString();
  }
  
  /**
   * 漢数字から指定された文字に変換する
   */
  public String encode(String kanji){
    String result = kanji;
    for(int i=0;i<KANJI_NUM_LIST.length;i++){
      result = result.replaceAll(KANJI_NUM_LIST[i],CODE_LIST[i]);
    }
    return result;
  }
}

ふぅ