Help us understand the problem. What is going on with this article?

【C#】ProjectEuler 14,15,16問目

More than 1 year has passed since last update.

はじめに

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

11問目

正の整数に以下の式で繰り返し生成する数列を定義する.
n → n/2 (n が偶数)
n → 3n + 1 (n が奇数)

この数列はどのような数字からはじめても最終的には 1 になると考えられているが, まだそのことは証明されていない(コラッツ問題)
さて, 100万未満の数字の中でどの数字からはじめれば最長の数列を生成するか.
注意: 数列の途中で100万以上になってもよい

private void button14_Click(object sender, EventArgs e)
        {
            int Count = 0;
            int MaxCount = 0;
            long CurrentValue = 0;
            int MaxCountNumber = 0;
            for (int i = 1; i < 1000001; i++)
            {
                CurrentValue = i;
                Count = 1;
                while (CurrentValue != 1)
                {
                    if (CurrentValue % 2 == 0)
                    {
                        CurrentValue /= 2;
                        Count++;
                    }
                    else
                    {
                        CurrentValue = (3 * CurrentValue) + 1;
                        Count++;
                    }
                }
                if (MaxCount < Count)
                {
                    MaxCountNumber = i;
                    MaxCount = Count;
                }
            }
            label1.Text = "Answer = " + MaxCountNumber;
        }

1000000以下の数字に対して、1でない間は数列の定義の通りに計算し、1になるまで計算できた回数をカウントして答えとしました。

15問目

20X20の格子経路の最短経路数を求めよ

 private void button15_Click(object sender, EventArgs e)
        {

            long Denom = 1;
            long Numer = 1;

            for (int i = 40; i > 20; i--)
            {
                Denom *= (i - 20);
                Numer *= i;
                for (int j = 2; j < 6; j++)
                {
                    if (Numer % j == 0 && Denom % j == 0)
                    {
                        Numer /= j;
                        Denom /= j;
                    }
                }
            }
            label1.Text = "Answer = " + Numer / Denom;
        }

40 C 20を2から6で約分しながら計算しました。

16問目

2の1000乗の値の、各位の数字の和を求めよ

        private void button16_Click(object sender, EventArgs e)
        {

            BigInteger Number = 1;
            for (int i = 1; i < 1001; i++)
            {
                Number *= 2;
            }
            string NumberString = Number.ToString();
            int SumEachNumber = 0;
            for (int i = 0; i < NumberString.Length; i++)
            {
                char EachNumber = NumberString[i];
                SumEachNumber += (EachNumber - '0');
            }
            label1.Text = "Answer = " + SumEachNumber;
        }

2を1000乗して、文字列にした後、一文字ずつint型に変換して合計しています。2の1000乗はかなり大きな値になるので、扱えるのか疑問でしたが、BigInteger型を用いることで扱うことができました。

Why do not you register as a user and use Qiita more conveniently?
  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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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