【C#】ProjectEuler26, 27, 28問目

#はじめに
C#を用いてProjectEulerに挑戦している人の記録です。VisualStudio2017で、1つのフォームアプリの中に問題番号のボタンを作成し、そのボタンをクリックすると結果をラベルに表示するという形式でやっています。
#26問目
d < 1000 なる $\frac{1}{d}$ の中で小数部の循環節が最も長くなるような d を求めよ.

```CSharp　　
public static int Cycle(BigInteger Value)
        {
            while (Value % 2 == 0)
            {
                Value = BigInteger.Divide(Value, 2);
            }
            while (Value % 5 == 0)
            {
                Value = BigInteger.Divide(Value, 5);
            }
            if (Value == 1) { return 0; }
            int Count = 1;
            while (BigInteger.Remainder((BigInteger.Pow(10, Count)), Value) != 1)
            {
                Count++;
            }
            return (int)Count;
        }

        private void button26_Click(object sender, EventArgs e)
        {
            int MaxCount = 0;
            int Count = 0;
            int MaxValue = 0;
            for (BigInteger i = 2; i < 1000; i = BigInteger.Add(i, 1))
            {
                Count = Cycle(i);
                if (MaxCount < Count)
                {
                    MaxCount = Count;
                    MaxValue = (int)i;
                }
            }
            label1.Text = "Answer = " + MaxValue + " CycleLength = " + MaxCount;
        }
```
```math
10^n ÷ i (i=1, 2, 3, ... ,1000)
```
の剰余が1になった時のnが循環節の長さとなるため、その値が一番大きい値を答えとしました。

#27問目
 |a| < 1000, |b| ≤ 1000 として以下の二次式を考える (ここで |a| は絶対値): 例えば |11| = 11 |-4| = 4である.

```math
n^2 + an + b = 0

```
n = 0 から始めて連続する整数で素数を生成したときに最長の長さとなる上の二次式の, 係数 a, b の積を答えよ.

```CSharp
public static bool Sosuu(int n)
        {
            if (n <= 1) return false;
            for (int i = 2; i * i < n; i++)
            {
                if (n % i == 0) return false;
            }
            return true;
        }public static bool Sosuu(int n)
        {
            if (n <= 1) return false;
            for (int i = 2; i * i < n; i++)
            {
                if (n % i == 0) return false;
            }
            return true;
        }

private void button27_Click(object sender, EventArgs e)
        {
            int MaxLength = 0;
            for (int a = -999; a < 1000; a++)
            {
                for (int b = -1000; b < 1000; b++)
                {
                    for (int n = 0; n < int.MaxValue; n++)
                    {
                        int Value = (n * n) + (a * n) + b;
                        if (Sosuu(Value) == false) { break; }
                        if (MaxLength < n)
                        {
                            MaxLength = n;
                            label1.Text = ("a=" + a + "b=" + b + "の時" + MaxLength + "個の素数生成、ab=" + a * b);
                        }

                    }
                }
            }
        }
```
問題文の式を全通り計算し、式の値が素数でない場合の一番大きなnの時のaとbを答えとしました。
#28問目
1から初めて右方向に進み時計回りに数字を増やしていき, 5×5の螺旋が以下のように生成される:
**21**	22	23	24	**25**
20	**7**	8	**9**	10
19	6	**1**	2	11
18	**5**	4	**3**	12
**17**	16	15	14	**13**

両対角線上の数字の合計は101であることが確かめられる.

1001×1001の螺旋を同じ方法で生成したとき, 対角線上の数字の和はいくつか?

```CSharp
private void button28_Click(object sender, EventArgs e)
        {
            int Value = 1;
            int plus = 1;
            for (int i = 1; i < 501; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    plus += i * 2;
                    Value += plus;
                }
            }
            label1.Text = "Answer = " + Value;
        }
```
対角線の値は中央の1, 2ずつ増加するものが4つ、4ずつ増加するものが4つ、6ずつ増加するものが4つ・・・という規則があるため、その規則通りの式で答えを導出しました。