プログラム脳を鍛える数学パズル 第5弾
どうも、小野氏です。
2週間くらい更新をさぼってしまい、申し訳ございません。
GWはマイクロサービスアーキテクチャについて調べており、その影響でプログラミングの学習がほとんどできませんでした。
(自分で書いていて、理由になっていないような気がしますが。。。)
マイクロサービスアーキテクチャの調査結果については、今月中にqiita記事に投稿する予定ですのでご興味があればご確認お願い致します。
前回に引き続き、プログラム脳を鍛える数学パズルの問題を解いていきたいと思います。
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問
- 作者:増井 敏克
- 発売日: 2015/10/14
- メディア: 単行本(ソフトカバー)
今週は本書のQ12についてRubyで実装したので、そちらについて紹介いたします。
Q12 平方根の数字
問題
平方根を小数で表した際に、0~9までの数字が最も早くすべて現れる最小の小数を、①計算結果の整数部分を含む数字全体を確認する場合と②計算結果の小数部分のみについて確認する場合にわけてそれぞれ求めよ。
アルゴリズム自体は難しくないのですが、実装するプログラミング言語における小数の扱いについて知らないと確信をもって回答が出来ない問題となっております。
回答
自分で考えて実装したものが以下のものです。
整数部分を含む場合についてのみ、アルゴリズムを解説いたします。
- 答えを格納する変数(answer_including_integer_part)と、平方根を適用する変数(n)をそれぞれ宣言する
- nを平方根を計算結果を、カンマを除外した後、左から10桁をそれぞれ配列に格納する
- 例えば2の平方根を計算した場合、この時点で配列は ["1", "4", "1", "4", "2", "1", "3", "5", "6", "2"]という状態になっている
- sprintfメソッドを用いて、小数点以下10桁が確実に出力されるようにしている(e4など、表記が変わることを避けている)
- 上述の作業で作成した配列から重複値を削除した後に、配列の長さがまだ10桁であった場合、その値を解答とする
- 重複排除後に配列の長さが10桁であるということは、0~9の要素がすべて含まれているということである。
解説
申し訳ございませんが、今回は特になしでお願いします。
所感
- 浮動小数の制度について理解が甘いことが露呈した。また機会を設け調べたいと思う。
- 本問題では、0~9の数字が10桁までに現れるという過程をおいて解いているが、そこに証明はいらないのかなと思ったり。。。
- プログラムを組んでいるので、やってみればいいと言われればそれまでなのですが。。。