xをn進数に変換するには

ここにある正の整数xがあります。xは2桁以上です。この数字の並びが13進法表記であるとみなすと、10進法表記であると見なした場合の倍数になります。この条件を満たす最も小さいxを求めるプログラムを書いてください。

倍数になる13進数 - どう書く?org

この問題を知って、「うーん、13進数に直すの面倒だな、再帰かなぁ」とか思った僕はだめ人間。

Integer.parseInt(Integer.toString(x), 13)

Integer#parseIntでできるじゃないか・・・。知らなかった。自分にしょんぼりだ。


でも悔しいので、再帰で実装してみた。

public class IntegerParser{
  public static void main(String[] args){
    System.out.println(parse(567,13));
  }
  
  // x を base進数とみなした場合の値を返却
  public static int parse(int x, int base){
    if(x==0) return x;
    return parse( x / 10 ,base) * base + x % 10;
  }
}

できた。やっぱり再帰なんて普段使わないから、ちょっと混乱する。
上記の例だとこんな感じの流れ。
# 最初混乱して↓の流れをそのまま紙に書いたorz

  1. 567 をもらって 10 で割って 56 を渡す(余りは7)
  2. 56 をもらって 10 で割って 5 を渡す(余りは6)
  3. 5 をもらって 10 で割って 0 を渡す(余りは5)
  4. 0なので0を返す
  5. 0 掛ける 13 足す 5 を返す(5を返す)
  6. 5 掛ける 13 足す 6 を返す(71を返す)
  7. 71 掛ける 13 足す 7 を返す(930を返す)
  8. 930だ!

かなり適当だけど、お題も解いてみた。
基数と答えの数は指定できるようにしてみた。

public class IntegerParser{
  public static void main(String[] args){
    int base   = 13;  // 基数
    int ansNum =  3;  // 何個みつけるか
    for(int i=10;;i++){
      int ans = parse(i,base);
      if(ans % i == 0){
        System.out.println(i + ", " + ans + ", " + ans/i);
        // 関係ないけど、 --ansNum ==0 ってなんか気持ち悪い気がする。
        if(--ansNum == 0){
          break;
        }
      }
    }
  }
  
  // x を base進数とみなした場合の値を返却
  public static int parse(int x, int base){
    if(x==0) return x;
    return parse( x / 10 ,base) * base + x % 10;
  }
}

できた!よかったよかった。