Webテキストで説明していた5つの数字の並べ替えを実際に行うプログラムを作成しましょう.
85 92 3 100 69 100 92 85 69 3 |
1〜365の整数を乱数により1つ発生させ,それを今年の元旦からの日数とするとき,それが何月何日かを答えるプログラムを作ってみましょう.1が出たら1月1日,365が出たら12月31日とします.
次に示す配列を利用すると,簡単になります.
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; |
Day 304 of 2019 Month: 10, Date: 31 |
出てきた日数からどこまで配列要素を引くことができるかで月が決まります.日にちの方は前の月までの総日数を引き去ることで求まります.解答例
日付があっているかどうかの確認は乱数では難しいので,変数の値を決め打ちして実行する方が確実です.例えば,32は2月1日で,60は3月1日とか,365は12月31日とかですかね.
0から9までの整数を10個ランダムな順番に発生させますが,数字の重複が無いように1回ずつ出てくるように発生させてください.
8 2 4 9 0 6 3 7 5 1 |
解答例
int num[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
という配列を用意して要素をランダムに並べ直すことで実現できます.
コミックの「はじめアルゴリズム」の第1巻で紹介されている「カプレカ数」の探索を行ってみましょう.4桁の正の整数を乱数により発生させ,その数に含まれる数字を大きい順に並べ替えたものと小さい順に並べ替えたものを作ります.そして,大きい数から小さい数を引いて,その答えの数も同様に大きい順と小さい順に並べ替えて引き算する,ということを繰り返すと,必ずある数に収束するというもので,その収束した数をカプレカ数と言います.
Original number: 5182 8521 - 1258 = 7263 7632 - 2367 = 5265 6552 - 2556 = 3996 9963 - 3699 = 6264 6642 - 2466 = 4176 ・ ・ ・ |
解答例手順はおよそ以下のようになります. 1.4桁の乱数発生 2.位取りにより各桁の4つの整数を分離して配列に入れる 3.配列の要素の並べ替え 4.2個の4桁の整数合成 5.一つ前の整数と同じか? 6.引き算 7.2.の作業に戻る