Project Euler

Project Euler Problem 43

steloflute 2012. 6. 9. 00:10

Problem 43

09 May 2003

The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property.

Let d1 be the 1st digit, d2 be the 2nd digit, and so on. In this way, we note the following:

  • d2d3d4=406 is divisible by 2
  • d3d4d5=063 is divisible by 3
  • d4d5d6=635 is divisible by 5
  • d5d6d7=357 is divisible by 7
  • d6d7d8=572 is divisible by 11
  • d7d8d9=728 is divisible by 13
  • d8d9d10=289 is divisible by 17

Find the sum of all 0 to 9 pandigital numbers with this property.


Answer:
16695334890

 

 

C#

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;

namespace Euler {
    class Program {
        static string arrayToString<T>(T[] array) {
            return array.Select(x => Convert.ToString(x)).Aggregate(string.Concat);
        }

        static long sum = 0;
        static void permute(int[] n, int level = 0) {
            if (level > n.Length - 1) {
                //Console.Write(count + ": ");
                //foreach (var x in n) Console.Write(x);
                //Console.WriteLine();
                //Console.ReadKey();

                string strN = arrayToString(n);
                //Console.WriteLine(strN);
                //Console.ReadKey();
                if (Convert.ToInt64(strN.Substring(7, 3)) % 17== 0 &&
                    Convert.ToInt64(strN.Substring(6, 3)) % 13== 0 &&
                    Convert.ToInt64(strN.Substring(5, 3)) % 11== 0 &&
                    Convert.ToInt64(strN.Substring(4, 3)) % 7 == 0 &&
                    Convert.ToInt64(strN.Substring(3, 3)) % 5== 0 &&
                    Convert.ToInt64(strN.Substring(2, 3)) % 3 == 0 &&
                    Convert.ToInt64(strN.Substring(1, 3)) % 2 == 0) {
                        sum += Convert.ToInt64(strN);
                }
                return;
            }
            for (int i = 0; i <= 9; i++) {
                bool hasDuplicate = false;
                for (int priorLevel = 0; priorLevel < level; priorLevel++) {
                    if (i == n[priorLevel]) {
                        hasDuplicate = true;
                        break;
                    }
                }
                if (!hasDuplicate) {
                    n[level] = i;
                    permute(n, level + 1);
                }
            }
        }

        static void Main(string[] args) {
            permute(new int[10]);
            Console.WriteLine(sum);
        }
    }
}



'Project Euler' 카테고리의 다른 글

Project Euler Problem 45  (0) 2012.06.09
Project Euler Problem 44  (0) 2012.06.09
Project Euler Problem 42  (0) 2012.06.09
Project Euler Problem 41  (0) 2012.06.09
Project Euler Problem 40  (0) 2012.06.09