トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Problem32 1から9までを1回ずつ使う掛け算

問題

7254は面白い性質を持っている. 39 × 186 = 7254と書け, 掛けられる数/掛ける数/積に1から9の数が1回ずつ出現する.
掛けられる数/掛ける数/積に1から9の数が1回ずつ出現するような積の総和を求めよ.

いくつかの積は, 1通り以上の掛けられる数/掛ける数/積の組み合わせを持つが1回だけ数え上げよ.


ソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        var KouhoList = new List<int>();
        for (int I = 1; I <= 9999; I++) {
            if (IsKouho(I)) KouhoList.Add(I);
        }

        var ProdValList = new List<int>();

        for (int I = 1; I <= KouhoList.Count - 1; I++) {
            for (int J = I + 1; J <= KouhoList.Count - 1; J++) {
                int ProdVal = KouhoList[I] * KouhoList[J];
                if (ProdVal >= 9876543) break; //積の値で枝切り

                int[] wkArr = { KouhoList[I], KouhoList[J], ProdVal };
                if (ProdValList.Contains(ProdVal) == false && IsOK(wkArr)) {
                    ProdValList.Add(ProdVal);
                    Console.WriteLine("{0} * {1} = {2}", KouhoList[I], KouhoList[J], ProdVal);
                }
            }
        }
        Console.WriteLine("合計={0}", ProdValList.Sum());
    }

    static bool IsKouho(int pTargetInt)
    {
        bool[] IsAppearArr = new bool[10];
        do {
            int ModVal = pTargetInt % 10;
            if (ModVal == 0) return false;
            if (IsAppearArr[ModVal]) return false;
            IsAppearArr[ModVal] = true;

            pTargetInt /= 10;
        } while (pTargetInt > 0);
        return true;
    }

    static bool IsOK(int[] pTargetArr)
    {
        bool[] IsAppearArr = new bool[10];
        foreach (int EachInt in pTargetArr) {
            int CopiedInt = EachInt;
            do {
                int ModVal = CopiedInt % 10;
                if (ModVal == 0) return false;
                if (IsAppearArr[ModVal]) return false;
                IsAppearArr[ModVal] = true;

                CopiedInt /= 10;
            } while (CopiedInt > 0);
        }
        for (int I = 1; I <= 9; I++)
            if (IsAppearArr[I] == false) return false;

        return true;
    }
}


実行結果

4 * 1738 = 6952
4 * 1963 = 7852
12 * 483 = 5796
18 * 297 = 5346
28 * 157 = 4396
39 * 186 = 7254
48 * 159 = 7632
合計=45228


解説

こまめに数値の候補を絞って解いてます。