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

【C#】ProjectEuler29, 30, 31問目

More than 1 year has passed since last update.

はじめに

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

29問目

$2 ≤ a ≤ 5$ と $2 ≤ b ≤ 5$について, $a^b$ を全て考える。
これらを小さい順に並べ, 同じ数を除いたとすると, 15個の項を得る:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125

$2 ≤ a ≤ 100$, $2 ≤ b ≤ 100$のとき、いくつの異なる項が存在するか。

private void button29_Click(object sender, EventArgs e)
        {
            var Hashset = new HashSet<BigInteger>();
            for (BigInteger i = 2; i <= 100; i++)
            {
                for (int j = 2; j <= 100; j++)
                {
                    Hashset.Add(BigInteger.Pow(i, j));
                }
            }
            label1.Text = "Answer = " + Hashset.Count;
        }

$a^b$を2から100まで行った結果をハッシュセットに代入し、ハッシュセットの内容の個数を答えとしました。ハッシュセットは同じデータの重複を許さないリストです。

30問目

驚くべきことに, 各桁を4乗した数の和が元の数と一致する数は3つしかない.

  • 1634 = 14 + 64 + 34 + 44
  • 8208 = 84 + 24 + 04 + 84
  • 9474 = 94 + 44 + 74 + 44

ただし, 1=14は含まないものとする. この数たちの和は 1634 + 8208 + 9474 = 19316 である.

各桁を5乗した数の和が元の数と一致するような数の総和を求めよ.

private void button30_Click(object sender, EventArgs e)
        {
            int AnswerSum = 0;
            int PowSum = 0;
            for (int i = 1000; i < 1000000; i++)
            {
                char[] NumberString = i.ToString().ToCharArray();
                for (int j = 0; j < NumberString.Length; j++)
                {

                    int EachNumber = NumberString[j] - '0';
                    int PowEachNumber = 1;
                    for (int k = 0; k < 5; k++) { PowEachNumber *= EachNumber; }
                    PowSum += PowEachNumber;
                    if (PowSum > i)
                    {
                        break;
                    }
                }
                if (PowSum == i)
                {
                    AnswerSum += i;
                    textBox1.AppendText(i.ToString() + " ");
                }
                PowSum = 0;
            }
            label1.Text = "Answer = " + AnswerSum;
        }

1000から1000000までの数字に対して、string型の文字列に変換し、char型の配列に変換し、int型に変換することで各桁の数字を取得し5乗してその輪と判定中の数字を比較しています。

31問目

イギリスでは硬貨はポンド£とペンスpがあり,一般的に流通している硬貨は以下の8種類である.

1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).

以下の方法で£2を作ることが可能である.

1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p

これらの硬貨を使って£2を作る方法は何通りあるか?

 private void button31_Click(object sender, EventArgs e)
        {
            int[] Money = new int[200 + 1];
            Money[0] = 1;
            int UB = Money.GetUpperBound(0);

            foreach (int EachInt in new int[] { 1, 2, 5, 10, 20, 50, 100, 200 })
            {
                for (int i = 0; i < UB; i++)
                {
                    if (Money[i] == 0) continue;

                    int NewInd = i + EachInt;
                    if (UB < NewInd) break;
                    Money[NewInd] += Money[i];
                }
            }
            label1.Text = "answer = " + Money[UB];
        }

1から200の状態を配列にいれ、その数字を取り得る場合の数を動的計画法で計算しています。

akrolayer
中小メーカで製品を操作するGUIを開発してます。
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