2014年11月09日

C#で倍数になる13進数を求める

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その47

■問題 (出題者:にしお さん)
ここにある正の整数xがあります。xは2桁以上です。この数字の並びが13進法表記であるとみなすと、10進法表記であると見なした場合の倍数になります。この条件を満たす最も小さいxを求めるプログラムを書いてください。
例えばxが567の時、これを13進法表記と見なすと5 * 13 * 13 + 6 * 13 + 7 で 930 になります。930は567の倍数ではないので、567は条件を満たしません。 条件を満たす数を見つけ出すプログラムを書いてください。「条件を満たす数を出力するプログラム」ではありません。(print 567などは禁止ということ。)

実用的な問題じゃなくて、整数パズル問題ですね。
intを 13進数表記とみなして、10進数に変換する ToDecimalNumber メソッドを定義していますが、 これは、13進数表記以外にも対応しています。
なので、11進数とか、15進数なんかでも、答えが見つかります。
このToDecimalNumber さえ作ってしまえば、あとは簡単ですね。

最初は、標準のConvertクラスが使えるんじゃないかと思ったのですが、13をベース値にすることができませんでした
。 まあ、13進数なんてのは実際のアプリ開発では使われないので、サポートされていなくも仕方ないですね。

using System;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            var n = GetAnswer();
            Console.WriteLine(n);
            Console.WriteLine("{0}が{1}進数表記だとすると10進数で{2}、ちょうど2倍になります",
                n, BaseNum, ToDecimalNumber(n, BaseNum));
            Console.ReadLine();
        }

        private const int BaseNum = 13;

        static int GetAnswer() {
            for (int i = 10; i < int.MaxValue; i++) {
                if (IsOK(i)) {
                    return i;
                }
            }
            return -1;
        }

        static bool IsOK(int n) {
            return ToDecimalNumber(n, BaseNum) == n * 2;
        }

        // 13進数以外でもOK
        private static int ToDecimalNumber(int num, int basenum) {
            int ans = 0;
            int i = 1;
            while (num > 0) {
                int remainder = num % 10;
                ans += i * remainder;
                num /= 10;
                i *= basenum;
            }
            return ans;
        }
    }
}



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52384213