組み込みエンジニアの現場力養成ドリル(32)
ソフトウェア工学的には羽生善治の「5二銀」は最善手ではない!? 東工大入試問題をプログラムで解く(4/4 ページ)
問題2の解答&解説
普通のプログラマーなら、この問題を見た瞬間、「for文を5つ書いてネストさせればよい」と思いますね。アルゴリズムは非常に簡単で、以下の図のようになります(5つのサイコロをd1、d2、d3、d4、d5とします)。
筆者のソースコードを巻末の「参考ソースコード2.5個のサイコロの目の和が7の倍数になる確率の計算」に示します。計算結果は以下のようになります。
全ての場合の数が7776通りで、7の倍数が1110通りなので、約分すると「185/1296」。これが答えです。
変数となるサイコロの目の変数名をd1からd5に決めれば、誰がプログラミングしても同じソースコードになります。また、サイコロを10個に拡張して7の倍数になる場合も簡単に計算できますし、サイコロ5個で目の和が8の倍数になる場合も簡単に計算可能です。for文を1つ書けば、コピー&ペーストで簡単にコーディングできますので、プログラミングは5分ほどで完成します。これが、泥臭い全数処理の素晴らしい点です、
エレガントな解法はカッコいいけれど、分かりにくく、拡張性に欠けます。全数チェックのアルゴリズムは泥臭いが、分かりやすくて拡張性があります。
処理時間を短くすることが生死にかかわるプログラミング、例えば、素数の解析や、ソート処理では、理解容易性を犠牲にして処理効率を求めますが、それ以外の処理方式では、分かりやすさが最優先です。桶狭間の戦いのような「妙手」を考える前に、正面からジワジワと敵を押し切る泥臭い方法を検討しましょう。正面突破は、数学的には、羽生五段の5二銀のような「妙手」ではありませんが、ソフトウェア工学的には、「最善手」です。
参考ソースコード1:ガウス数の問題の解法
/* [√n] が n の約数になる個数を計算する */
#include
#include
int main(void){
printf(" [√n] が n の約数になる個数を計算する。
");
int x, total_number = 0, mod_01, gaussian_value;
float value;
for (x = 1; x <= 10000; x++) { /* x を 1 から 10,000 まで動かす */
value = x; /* xの平方根を計算し、ガウス数(切捨て値)*/
gaussian_value = sqrtf(value); /* を求める。切り捨ては、変数の型のキャ */
/* スティングによる。
mod_01 = x % gaussian_value; /* ガウス数「gaussian_value」が */
if (mod_01 == 0) { /* 元の値「x」の約数かチェックする。 */
total_number = total_number + 1;
}
}
printf("個数 = %.0d
", total_number); /* [√n] がnの約数になる個数を表示 */
}
参考ソースコード2:5個のサイコロの目の和が7の倍数になる確率の計算
/* 5個のサイコロの目の和が7の倍数になる確率を計算する。 */
#include
int main(void){
printf("5個のサイコロの目の和が7の倍数になる確率を計算する。
");
int d1, d2, d3, d4, d5, sum_mod, total_number = 0;
for (d1 = 1; d1 <= 6; d1++) { /* サイコロd1を1から6まで動かす。*/
for (d2 = 1; d2 <= 6; d2++) { /* サイコロd2を1から6まで動かす。*/
for (d3 = 1; d3 <= 6; d3++) { /* サイコロd3を1から6まで動かす。*/
for (d4 = 1; d4 <= 6; d4++) { /* サイコロd4を1から6まで動かす。*/
for (d5 = 1; d5 <= 6; d5++) { /* サイコロd5を1から6まで動かす。*/
sum_mod = (d1 + d2 + d3 + d4 + d5) % 7; /* サイコロの目の和を7 */
if (sum_mod == 0) { /* で割って余りが0なら */
total_number = total_number + 1; /* total_number に1加算 */
}
}
}
}
}
}
printf("7の倍数になる個数 = %.0d
", total_number); /* 7の倍数を表示 */
printf("全数 = %.0d
", 6*6*6*6*6); /* 全数を表示 */
}
Copyright © ITmedia, Inc. All Rights Reserved.
組み込みエンジニアの現場力養成ドリル
このコラムでは、組み込みエンジニアが日々の開発で実際に遭遇する「小さなトラブルを」取り上げ、演習形式で解説します。
この記事の著者
新着ホワイトペーパー PR
-
製品資料
[株式会社 Green AI] AIで脱炭素計画を最適化、初年度からエネルギーコストとCO2を削減する方法 -
市場調査・トレンド
[スマートジャパン編集部] 「ペロブスカイト太陽電池」の普及戦略が公表 政府が目指すコスト・導入量のロードマップを解説 -
市場調査・トレンド
[スマートジャパン編集部] 導入が加速する再エネ・系統向け蓄電システム コスト・収益性の現状分析 -
技術文書・技術解説
[スマートジャパン編集部] いまさら聞けない「ペロブスカイト太陽電池」の基礎知識と政策動向 -
技術文書・技術解説
[スマートジャパン編集部] 「ペロブスカイト太陽電池」の開発動向、日本の投資戦略やコスト目標の見通しは?
関連記事
こんなメディアも見られています
TechFactoryに関連する情報をお探しであれば、こちらのメディアもお役に立てるかもしれません。
特集
- マテリアルズ・インフォマティクスの動向調査
- 研究・開発職のデジタル活用調査
- 設計・解析業務におけるAI活用
- 3Dプリンタ利用動向調査
- CAD利用動向調査
- つながる工場の現状と課題
- 製造業におけるAI開発および活用の実態
- 設計・製造現場における品質管理
ホワイトペーパーランキング PR
-
1
EE Times Japan×EDN Japan 統合電子版:フィジカルAIが生み出す新たな「設計思想」――電子版2026年8月号
-
2
半導体装置メーカー 業績まとめ【2027年3月期第1四半期】
-
3
新入社員に読んで欲しい鉄鋼材料の基礎知識まとめ(Part4)
-
4
一時は時価総額トヨタ超え キオクシア2026年度の動向
-
5
微細配線間の絶縁劣化をどう捉える? 先端パッケージ評価の最前線
-
6
新入社員に読んで欲しい鉄鋼材料の基礎知識まとめ(Part1)
-
7
EE Times Japan×EDN Japan 統合電子版:2026年上半期の半導体業界を振り返る――電子版2026年7月号
-
8
新入社員に読んで欲しい鉄鋼材料の基礎知識まとめ(Part3)
-
9
CADツールの見直しは本当に必要? 切り替えの理由と効果を7つの質問で検証
-
10
新入社員に読んで欲しい鉄鋼材料の基礎知識まとめ(Part2)
TechFactory SNS
インフォメーション
注目情報をチェック
TechFactoryをフォロー