【C#】ProjectEuler35, 36, 37問目

#はじめに
C#を用いてProjectEulerに挑戦している人の記録です。VisualStudio2017で、1つのフォームアプリの中に問題番号のボタンを作成し、そのボタンをクリックすると結果をラベルに表示するという形式でやっています。
#35問目
197は巡回素数と呼ばれる. 桁を回転させたときに得られる数 197, 971, 719 が全て素数だからである.
100未満には巡回素数が13個ある: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, および97である.
100万未満の巡回素数はいくつあるか?

```CSharp
 public static List<int> Eratosthenes(int Num)
        {
            int[] IntegerList = new int[Num];
            var PrimeNumberList = new List<int>();
            var j = 0;
            for (int i = 2; i < Num; i++) { IntegerList[i] = i; }

            int head = 0;
            double EndNum = Math.Sqrt(Num);

            while (head < EndNum)
            {
                //先頭を探す
                for (int i = j; i < Num; i++)
                {
                    if (IntegerList[i] != 0)
                    {
                        head = IntegerList[i];
                        PrimeNumberList.Add(head);
                        j = i;
                        break;
                    }
                }
                //ふるい落とし。落としたものには0を入れる
                foreach (int i in IntegerList)
                {
                    if (IntegerList[i] % head == 0) { IntegerList[i] = 0; }
                }
            }
            for (int a = 2; a < IntegerList.Length; a++)
            {
                if (IntegerList[a] != 0)
                {
                    PrimeNumberList.Add(IntegerList[a]);
                }
            }
            return PrimeNumberList;
        }
private void button35_Click(object sender, EventArgs e)
        {
            int CircularPrimeCount = 0;
            var PrimeNumberList = new List<int>(Eratosthenes(1000000));
            int PrimeNumberListCount = PrimeNumberList.Count;

            for (int i = 0; i < PrimeNumberListCount; i++)
            {
                int JudgeCount = 0;
                int PrimeNumberListLength = PrimeNumberList[i].ToString().Length;
                for (int j = 0; j < PrimeNumberListLength; j++)
                {
                    string CircularNumberString = PrimeNumberList[i].ToString().Substring(j) + PrimeNumberList[i].ToString().Substring(0, j);
                    if (PrimeNumberList.Contains(int.Parse(CircularNumberString)))
                    {
                        JudgeCount++;
                    }
                }
                if (JudgeCount == PrimeNumberListLength)
                {
                    CircularPrimeCount++;
                    textBox1.AppendText(CircularPrimeCount.ToString() + " ");
                }
            }
            label1.Text = "Answer = " + CircularPrimeCount;
        }
```
Eratosthenesで1000000以下の素数をリストに入れ、substringの先頭をずらした分を後で足すことによって巡回数を作っています。巡回数の数は桁数と等しいため、巡回数が素数だった数が桁数と等しかったら巡回素数とし、答えとしました。
#36問目
$585 = 1001001001_2$ (2進) は10進でも2進でも回文数である.
100万未満で10進でも2進でも回文数になるような数の総和を求めよ.
(注: 先頭に0を含めて回文にすることは許されない.)

```CSharp
private void button36_Click(object sender, EventArgs e)
        {
            int Sum = 0;
            for (int j = 1; j <= 1000000; j++)
            {
                if (j % 10 != 0)
                {
                    int Number = j;
                    string NumberString = Number.ToString();
                    var ReverseString = new string(NumberString.Reverse().ToArray());
                    if (ReverseString == NumberString)
                    {
                        string NumberString1 = Convert.ToString((Number), 2);
                        var ReverseString1 = new string(NumberString1.Reverse().ToArray());
                        if (ReverseString1 == NumberString1)
                        {
                            textBox1.AppendText(NumberString + " ");
                            Sum += Number;
                        }
                    }
                }
            }
            label1.Text = "Answer = " + Sum;
        }
```
Convert()で2進数に変換できるので、10進数、2進数ともにReverse()した文字列を比較して、等しかったものをカウントして答えとしました。
#37問目
3797は面白い性質を持っている. まずそれ自身が素数であり, 左から右に桁を除いたときに全て素数になっている (3797, 797, 97, 7). 同様に右から左に桁を除いたときも全て素数である (3797, 379, 37, 3).

右から切り詰めても左から切り詰めても素数になるような素数は11個しかない. 総和を求めよ.

注: 2, 3, 5, 7を切り詰め可能な素数とは考えない.

```CSharp
 private void button37_Click(object sender, EventArgs e)
        {
            var PrimeList = new List<int>(Eratosthenes(1000000));
            int Count = 0;
            int PrimeCount = 0;
            int sum = 0;
            for (int i = 10; Count < 11; i++)
            {
                if (PrimeList.Contains(i))
                {
                    for (int j = 1; j < i.ToString().Length; j++)
                    {
                        string RightSubString = i.ToString().Substring(j);
                        string LeftSubString = i.ToString().Substring(0, i.ToString().Length - j);
                        if (PrimeList.Contains(int.Parse(RightSubString)))
                        {
                            if (PrimeList.Contains(int.Parse(LeftSubString)))
                            {
                                PrimeCount++;
                            }
                        }
                    }
                    if (PrimeCount == i.ToString().Length - 1)
                    {
                        Count++;
                        sum += i;
                        textBox1.AppendText(i.ToString() + " ");
                    }
                    PrimeCount = 0;
                }
            }
            label1.Text = "Answer = " + sum;
        }
```
1000000までの素数をとりあえず出します。答えは11個ということなので、11個答えが見つかった時点でループを抜けます。substringを使って、右詰め、左詰めの数字を作って素数かどうか判定し、題意を満たす数を合計しています。
(11個目見つかるまでが長い。）