いきなりではあるが、以下のような問題を目にされたことはないだろうか。
鶴と亀が合わせて100匹います。足の数の合計が274本のとき、鶴と亀はそれぞれ何匹(羽)でしょうか?
この問題は鶴亀算と呼ばれている。
条件を整理しよう。
鶴と亀の合計は100匹。
(1)x+y=100 (ここで、xは鶴の数、yは亀の数とする。)
足の本数の合計は274本。(鶴の足は2本、亀の足は4本)
(2)2x+4y=274
まず、式(1)から x=100−y を導く。
そしてこれを式 (2)に代入する。
2(100−y)+4y=274
200−2y+4y=274
2y = 74
y= 37
これを式(1)に代入してx を求める。
答え
鶴は 63羽、亀は 37匹。
この問題をC言語で表現してみよう。
以下にプログラムの一例をご紹介する。
//鶴亀算プログラム(第1版)
#include <stdio.h>
int main(void)
{
int total_animals = 100; //鶴と亀の合計は100
int total_legs = 274; //足の本数の合計は274
int cranes, turtles;
for (cranes = 0; cranes <= total_animals; cranes++) {
turtles = total_animals - cranes;
if ((2 * cranes + 4 * turtles) == total_legs) {
printf("鶴の数: %d羽\n", cranes);
printf("亀の数: %d匹\n", turtles);
break;
}
}
return 0;
}
実行結果
鶴の数: 63羽
亀の数: 37匹
for ループで鶴の数を 0〜100 まで試して、亀の数を (100 – 鶴の数 )として計算し、それぞれの足の本数を合計して、条件と合致するかを確認している。
そして、条件に合致したら、答えを出力して終了する。
ただし、このプログラムは、あらかじめ鶴と亀の数の合計と足の数の合計を仕込む必要があり、とても実用的とは言えない。
そこで、鶴と亀の数の合計と足の合計をユーザーが入力し、それに基づいて鶴と亀の数を自動で計算して出力するプログラムに改良したものをご紹介しよう。
//鶴亀算プログラム(第2版)
#include <stdio.h>
int main(void)
{
int total_animals, total_legs;
int cranes, turtles;
int found = 0;
// 鶴と亀の合計と足の合計をユーザーが入力
printf("鶴と亀の合計を入力してください: ");
scanf("%d", &total_animals);
printf("足の合計を入力してください: ");
scanf("%d", &total_legs);
// 0〜total_animals の範囲で全探索
for (cranes = 0; cranes <= total_animals; cranes++) {
turtles = total_animals - cranes;
if ((2 * cranes + 4 * turtles) == total_legs) {
printf("鶴の数: %d羽\n", cranes);
printf("亀の数: %d匹\n", turtles);
found = 1;
break;
}
}
if (!found) {
printf("条件に合う鶴と亀の組み合わせはありません。\n");
}
return 0;
}
実行結果
鶴と亀の合計を入力してください: 200
足の合計を入力してください: 468
鶴の数: 166羽
亀の数: 34匹
- ユーザーが入力した鶴と亀の数と足の数の合計をscanf を使って読み込む。
- 条件に合う組み合わせを for ループで探索する。
- 条件に合わない場合には「条件に合う組み合わせはありません」と出力する。
コメント