【C#】ProjectEuler38, 39, 40問目

#はじめに
C#を用いてProjectEulerに挑戦している人の記録です。VisualStudio2017で、1つのフォームアプリの中に問題番号のボタンを作成し、そのボタンをクリックすると結果をラベルに表示するという形式でやっています。
#38問目
192 に 1, 2, 3 を掛けてみよう.

192 × 1 = 192
192 × 2 = 384
192 × 3 = 576

積を連結することで1から9の パンデジタル数 192384576 が得られる. 192384576 を 192 と (1,2,3) の連結積と呼ぶ.

同じようにして, 9 を 1,2,3,4,5 と掛け連結することでパンデジタル数 918273645 が得られる. これは 9 と (1,2,3,4,5) との連結積である.

整数と (1,2,...,n) (n > 1) との連結積として得られる9桁のパンデジタル数の中で最大のものはいくつか?

```CSharp
 private void button38_Click(object sender, EventArgs e)
        {
            int max = 0;
            for (int i = 1; i <= 9999; i++)
            {
                string CombineProductString = "";
                for (int j = 1; CombineProductString.Length < 9; j++)
                {
                    CombineProductString += (i * j).ToString();
                }
                if (CombineProductString.Length == 9)
                {
                    var IntHs = new HashSet<int>();
                    for (int a = 0; a < CombineProductString.Length; a++)
                    {
                        if (CombineProductString[a] != '0')
                        {
                            IntHs.Add(CombineProductString[a]);
                        }
                    }
                    if (IntHs.Count == 9)
                    {
                        if (max < int.Parse(CombineProductString))
                        {
                            max = int.Parse(CombineProductString);
                        }
                    }
                }
            }
            label1.Text = "answer = " + max;
        }
```
4桁の数字の（1，2）が9桁になる最大のため、9999まで考えます。連結数を作って、1文字ずつハッシュセットに入れて要素数が9個だった時の最大の数字を答えとしました。

#39問目
辺の長さが {a,b,c} と整数の3つ組である直角三角形を考え, その周囲の長さを p とする. p = 120のときには3つの解が存在する:

{20,48,52}, {24,45,51}, {30,40,50}

p ≤ 1000 のとき解の数が最大になる p はいくつか?

```CSharp
 private void button39_Click(object sender, EventArgs e)
        {
            int MaxCount = 0;
            var SumList = new List<int>();
            for (int a = 1; a < 500; a++)
            {
                for (int b = 1; b < 500; b++)
                {
                    for (int c = 1; c < 500; c++)
                    {
                        if (c * c == a * a + b * b && a + b + c < 1000)
                        {
                            SumList.Add(a + b + c);
                        }
                    }
                }
            }
            SumList.Sort();
            int count = 0;
            int MaxNumber = 0;
            for (int a = 0; a < SumList.Count - 1; a++)
            {
                count++;
                if (SumList[a] == SumList[a + 1])
                {
                    count++;
                }
                else
                {
                    textBox1.AppendText("Number=" + SumList[a].ToString() + "count = " + count.ToString());
                    if (MaxCount < count)
                    {
                        MaxCount = count;
                        MaxNumber = SumList[a];
                    }
                    count = 0;
                }
            }
            label1.Text = "Answer= " + MaxNumber.ToString();
        }
```
三平方の定理が成り立つ場合における3辺の合計値をリストに入れてソートし、リストの1つ先と比較して等しい値が一番多いものを答えとしました。
#40問目
正の整数を順に連結して得られる以下の10進の無理数を考える:

$0.123456789101112131415161718192021...$

小数第12位は1である.

$d_n$で小数第n位の数を表す. $d_1 × d_{10} × d_{100} × d_{1000} × d_{10000} × d_{100000} × d_{1000000}$ を求めよ.

```CSharp
private void button40_Click(object sender, EventArgs e)
        {
            var NumberString = new StringBuilder();
            for (int i = 0; NumberString.Length <= 1000000; i++)
            {
                NumberString.Append(i.ToString());
            }
            int Index = 1;
            int Answer = 1;
            for (int i = 0; i < 6; i++) 
            {
                int a = int.Parse(NumberString[Index].ToString());
                Index *= 10;
                Answer *= a;
            }
            label1.Text = "Answer = " + Answer.ToString();
        }
```
最初に題意通りの文字列を1000000まで作ります。小数第n位は文字列のインデックスと対応するので、インデックスを10倍していくことで指定された小数第n位の数字を取り出すことができ、それを掛け算して答えとしました。
#終わりに
今回は難しい問題はなかったと思いますが、もっと簡単にできる方法があるのではないかと思います。