トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Cマガ電脳クラブ(第093回) 端数よりダンゴ
問題
0ではない数字 (1〜9) をふたつ選び、これらをX、Yとしておく。
このX、Yの間に何個かの(1個以上)0を挟み込み、
X000・・・00Y
という数を考えたときに、この数がYXという数で割りきれるものを探してほしい。
たとえば、
300001/13=2307
となる。
ここで、ある数X、Yの間には、割り切れるのに必要な最小の個数の0を挟むこと、
と約束すると、0の数が最長になるX、Yは何だろうか。
ソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
struct AnswerKouhoDef
{
internal int X;
internal int Y;
internal int ZeroCnt;
}
static void Main()
{
var AnswerKouhoList = new List<AnswerKouhoDef>();
for (int X = 1; X <= 9; X++) {
for (int Y = 1; Y <= 9; Y++) {
bool HasAnswer; int ZeroCnt;
DeriveZeroCnt(X, Y, out HasAnswer, out ZeroCnt);
if (HasAnswer == false) {
Console.WriteLine("X={0},Y={1}の場合、割り切れません", X, Y);
continue;
}
Console.WriteLine("X={0},Y={1}の場合、0の数={2}", X, Y, ZeroCnt);
AnswerKouhoDef WillAdd;
WillAdd.X = X; WillAdd.Y = Y;
WillAdd.ZeroCnt = ZeroCnt;
AnswerKouhoList.Add(WillAdd);
}
}
int AnswerZeroCnt = AnswerKouhoList.Max(X => X.ZeroCnt);
AnswerKouhoList.RemoveAll(X => X.ZeroCnt < AnswerZeroCnt);
AnswerKouhoList.ForEach(
A => Console.WriteLine("答えは、X={0},Y={1}の時で、0の数={2}", A.X, A.Y, A.ZeroCnt));
}
//割り切れるのに必要な0の数を求める
static void DeriveZeroCnt(int pX, int pY, out bool pHasAnswer, out int pZeroCnt)
{
pHasAnswer = false; pZeroCnt = 1;
int Hou = 10 * pY + pX;
int ProdMod = (pX * 100) % Hou;
var ProdModList = new List<int>() { ProdMod };
while (true) {
if ((pY + ProdMod) % Hou == 0) {
pHasAnswer = true;
return;
}
ProdMod = (ProdMod * 10) % Hou;
if (ProdModList.Contains(ProdMod)) return;
ProdModList.Add(ProdMod);
pZeroCnt++;
}
}
}
実行結果
省略
X=8,Y=7の場合、割り切れません
X=8,Y=8の場合、0の数=2
X=8,Y=9の場合、割り切れません
X=9,Y=1の場合、0の数=16
X=9,Y=2の場合、0の数=26
X=9,Y=3の場合、0の数=4
X=9,Y=4の場合、0の数=40
X=9,Y=5の場合、0の数=56
X=9,Y=6の場合、0の数=20
X=9,Y=7の場合、0の数=11
X=9,Y=8の場合、0の数=42
X=9,Y=9の場合、0の数=2
答えは、X=7,Y=9の時で、0の数=94
解説
合同式の公式
(A*B) mod C = ((A mod C) * B) mod C
を使ってます。