トップページに戻る
次の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
解説
こまめに数値の候補を絞って解いてます。