LoginSignup
1
2

More than 5 years have passed since last update.

【C#】ProjectEuler29, 30, 31問目

Last updated at Posted at 2019-01-09

はじめに

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の状態を配列にいれ、その数字を取り得る場合の数を動的計画法で計算しています。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2