Project Euler 30

Problem 30

上限値を考える

何桁まで調べればよいのだろうか。9 の 5 乗で調べてみる。

[11] pry(main)> (1..10).each { |i| puts "i:#{i} #{9**5 * i}" }
i:1 59049
i:2 118098
i:3 177147
i:4 236196
i:5 295245
i:6 354294
i:7 413343
i:8 472392
i:9 531441
i:10 590490

9 の 5 乗は 59049 だから、1 桁増えても 59409 しか増えない。6 桁まで調べればいいのか。

プログラム

  • 各桁の 5 乗の和を、桁でソートして一致するかどうか確認しています。
  • SequenceEqual メソッドで、2 つの配列が等しいかどうか調べることができます。
using System;
using System.Collections.Generic;
using System.Linq;

class PE030 {
    static void Calc1(int p, int[] digits, List<int> acc) {
        if (p == digits.Length) {
            int sum = digits.Select(e => (int)Math.Pow(e, 5)).Sum();
            var x = sum.ToString().OrderBy(e => e).Select(e => e - '0').ToArray();
            if (digits.SequenceEqual(x)) {
                acc.Add(sum);
            }
            return;
        }

        int startDigit = p == 0 ? 0 : digits[p-1];
        for (int i = startDigit; i < 10; i++) {
            digits[p] = i;
            Calc1(p+1, digits, acc);
        }
    }

    static int Calc(int n) {
        int[] digits = new int[n];
        var acc = new List<int>();
        Calc1(0, digits, acc);

        foreach (var a in acc) Console.WriteLine(a);
        return acc.Sum();
    }

    static void Main() {
        int ans = 0;
        for (int i = 2; i <= 6; i++) {
            ans += Calc(i);
        }
        Console.WriteLine(ans);
    }
}

参考: