• 0
    Like
  • 0
    Comment

    三角数とは

    三角数とは、自然数を順次加えることで求められる数のことです。具体的には、

    1
    3   (=1+2)
    6   (=1+2+3)
    10  (=1+2+3+4)
    15  (=1+2+3+4+5)
    ...
    

    となります。
    これをどうして三角数と言うのかは、米俵を三角形に積み上げていった時の様子を思い浮かべていただければ分かるかと思います。

    n番目の三角数を t(n) とすると、

    t(0) = 0
    t(n) = t(n-1) + n
    

    と定義できます。

    C#のコード

    以下の3つのメソッドを書いてみることにします。

    • 先頭からn個の三角数を求める
    • 三角数かどうかを調べる
    • n番目の三角数を求める

    以下に、C#のコードTriangularNumberクラスを示します。

    TriangularNumber.cs
    public static class TriangularNumber {
        // 三角数を列挙する
        public static IEnumerable<int> Take(int n) {
            yield return 0;
            int ans = 0;
            for (int i = 1; i < n; i++) {
                ans += i;
                yield return ans;
            }
        }
    
        // 三角数かを調べる
        public static bool IsCorrect(long x) {
            long a = 8 * x + 1;
            long b = (long)(Math.Sqrt(a));
            if (b * b != a)
                return false;
            return (b - 1) % 2 == 0;
        }
    
        // n番目の三角数を求める
        public static long GetAt(int nth) {
            return (long)nth * (nth + 1) / 2;
        }
    }
    

    「n番目の三角数を求める」GetAtメソッドは前述の定義通りに、再帰を使うこともできますが、n が大きな数の場合は、あまり効率的ではありませんので、以下の公式を使っています。

    t(n) = n * (n + 1) / 2
    

    TriangularNumber.Takeメソッドの実行例

    以下のコードで先頭から30個までの三角数を列挙してみました。

        var nums = TriangularNumber.Take(30);
        int n = 0;
        foreach (var tn in nums) {
            Console.WriteLine($"{n} : {tn}");
            n++;
        }
    

    結果

    0 : 0
    1 : 1
    2 : 3
    3 : 6
    4 : 10
    5 : 15
    6 : 21
    7 : 28
    8 : 36
    9 : 45
    10 : 55
    11 : 66
    12 : 78
    13 : 91
    14 : 105
    15 : 120
    16 : 136
    17 : 153
    18 : 171
    19 : 190
    20 : 210
    21 : 231
    22 : 253
    23 : 276
    24 : 300
    25 : 325
    26 : 351
    27 : 378
    28 : 406
    29 : 435
    

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