読者です 読者をやめる 読者になる 読者になる

Project Euler 32

Problem 32

  • 1 桁 x 4 桁、もしくは 2 桁 x 3 桁のいずれか。
  • 1 桁 x 3 桁はありえない。9 * 999 = 8991 なので、最大でも 8 桁にしかならないから。
  • 3 桁 x 3 桁はありえない。100 * 100 = 10000 なので、9 桁を超えてしまうから。
using System;
using System.Collections.Generic;
using System.Linq;

class PE032 {
    static bool IsPandigital(int a, int b) {
        var s = a.ToString() + b.ToString() + (a*b).ToString();
        if (s.Length != 9) return false;
        
        int[] freq = new int[10];
        foreach (char c in s) {
            if (c == '0') return false;
            if (++freq[c - '0'] > 1) return false;
        }

        Console.WriteLine("{0} * {1} = {2}", a, b, a * b);
        return true;
    }
    
    static void Main() {
        var st = new HashSet<int>();
        for (int i = 1; i < 10; i++) {
            for (int j = 1000; j < 10000; j++) {
                if (IsPandigital(i, j))
                    st.Add(i * j);
            }
            
        }

        for (int i = 10; i < 100; i++) {
            for (int j = 100; j < 1000; j++) {
                if (IsPandigital(i, j))
                    st.Add(i * j);
            }
        }
        Console.WriteLine(st.Sum());
    }
}
  • intToString メソッドを呼び出せるのが、とても新鮮にみえる。