C#
数学パズル

C#で数学パズル - 割り切れる4桁の逆転数

以下の問題をC#で解いてみたいと思います。

問題

4桁の数値を順序を逆転させた数値(例えば、5432の場合は2345が逆転させた数値)で割ったときに、割り切れる4桁の数を求めよ。 (5432 / 2345 は割り切れないので求める答えではない)
ただし、商が1のものや、割る数が4桁でないものは除外する。

C#のコード

class Program {
    static void Main(string[] args) {
        for (int n = 1000; n < 9999; n++) {
            int r = ReverseNumber(n);
            if (n != r && (n % r == 0) && (r > 1000))
                Console.WriteLine(n);
        }
    }
    private static int ReverseNumber(int n) {
        int ans = 0;    
        while (n > 0) {
            int remainder = n % 10;
            ans = ans * 10 + remainder;
            n /= 10;    
        }    
        return ans;
    }
}

実行結果

8712
9801

へー、NEC PC-9801(1980年代から90年代に一世を風靡したPC)の9801と何か関係があるのかな。それとも偶然?

4桁以外でも求めてみる

この問題をもう少し一般化してみます。

問題

N桁の数値を順序を逆転させた数値(例えば、5432の場合は2345が逆転させた数値)で割ったときに、割り切れるN桁の数を求めよ。
ただし、商が1のものや、割る数がN桁でないものは除外する。
なお、Nは、2 <= N <= 9 の自然数とする。

C#のコード

class Program {
    static void Main(string[] args) {
        for (int n = 2; n < 10; n++) 
            DivisibleReverseNumber(n);
    }

    private static void DivisibleReverseNumber(int digit) {
        var start = (int)Math.Pow(10, digit-1);
        var end = (int)Math.Pow(10, digit);
        for (int n = start; n < end; n++) {
            int r = ReverseNumber(n);
            if (n != r && (n % r == 0) && (r.ToString().Length == digit))
                Console.WriteLine(n);
        }
    }
    private static int ReverseNumber(int n) {
        int ans = 0;
        while (n > 0) {
            int remainder = n % 10;
            ans = ans * 10 + remainder;
            n /= 10;
        }
        return ans;
    }
}

先ほど書いた、Mainメソッドの中身を一般化して、DivisibleReverseNumberメソッドを定義しました。引数は桁数です。

Mainメソッドでは、これを2から9まで回します。

実行結果

8712
9801
87912
98901
879912
989901
8799912
9899901
87128712
87999912
98019801
98999901
871208712
879999912
980109801
989999901

一部を抜き出すと、8712, 87912, 879912, 8799912, 87999912, 879999912 という数があります。9801についても、9801, 98901, 989901... と同じようなパターンがあります。

なかなか興味深い結果がでましたね。不思議です。


この記事は、Gushwell's C# Programming Pageで公開したものをに加筆・修正したものです。