以下の問題を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で公開したものをに加筆・修正したものです。