Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@gushwell

C#:三角数を求める

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

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
gushwell
株式会社ジード / Microsoft MVP for Developer Technologies 2005-2020 / 著書『実戦で役立つ C#プログラミングのイディオム/定石&パターン』『新・標準プログラマーズライブラリ なるほどなっとく C#入門』『C#プログラミング入門―オブジェクト指向のプログラミング手法を基礎から解説』

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?