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
- 567 をもらって 10 で割って 56 を渡す(余りは7)
- 56 をもらって 10 で割って 5 を渡す(余りは6)
- 5 をもらって 10 で割って 0 を渡す(余りは5)
- 0なので0を返す
- 0 掛ける 13 足す 5 を返す(5を返す)
- 5 掛ける 13 足す 6 を返す(71を返す)
- 71 掛ける 13 足す 7 を返す(930を返す)
- 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; } }
できた!よかったよかった。