パズル問題解法のアルゴリズム講座
for (a=10; a <= 99; a++) {
for (b=10; b <= 99; b++) {
この場所で90×90=8100通りの組み合わせが順次実現される
}
}
・各数字の桁数をチェック
3段目と4段目の数は3桁。5段目の数は4桁でなければなりません。
例えば3桁かどうかをチェックするには、こんな記述になります。
if (c >= 100 && c <= 999) {
この場所はcが3桁の数である場合のみ
}
・指定された位置における数とのチェック
if (sub(d,3) == 4) {
この場所はdの3桁目が4である場合のみ
}
|
C言語ソースリスト
Javaアプレットの実行 |
/* 出力情報 */
int A, B; /* 1段目と2段目の数 */
int cnt; /* 解の個数 */
/* 10進数nのm桁目の数を返すサブルーチン */
int sub(int n, int m) {
int i;
/* nをm-1回,10で割る */
for (i=1; i < m; i++)
n /= 10;
/* 10で割った余りを返す */
return n % 10;
}
/* パズル問題を解く */
void puzzle() {
int a, b, c, d, e;
for (a=10; a <= 99; a++) { /* 1段目の数を生成 */
for (b=10; b <= 99; b++) { /* 2段目 〃 */
c = a * (b % 10); /* 3段目の数を計算 */
d = a * (b / 10); /* 4段目 〃 */
e = a * b; /* 5段目 〃 */
/* 各数字の桁数をチェック */
if (c >= 100 && c <= 999 &&
d >= 100 && d <= 999 &&
e >= 1000 && e <= 9999) {
/* dの2桁目が4で,eの3桁目が3か? */
if (sub(d,2)==4 && sub(e,3)==3) { /* 例題1の場合は if (sub(a,1)==1 && sub(e,4)==9) とする */
A = a; B = b; /* 解の記録 */
cnt++; /* 解の個数 */
}
}
}
}
}