Edited at

C#:三角数を求める

More than 1 year has passed since last update.


三角数とは

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


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クラスを示します。

ソースコードはGitHubで公開しています。


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