« 「ディビジョン・ナイン問題」の高度じゃないコード | トップページ | 「レッド・アンド・ホワイト問題」の高度じゃないコード »

2016年5月13日 (金)

「コード・トライアスロン2」の高度じゃないコード

またまた一ヶ月以上間が開いてしまいましたが、「高度じゃないコード」シリーズその11、「コード・トライアスロン2」です。

数学の問題をプログラミングで解こう!「コード・トライアスロン2」問題解説

この問題は、三角関数の誤差で悩みました。第一段階で求めた答えが少しずれると、最後の答えが全く違った値になるからです。でも、実際は、誤差のせいではなく、私がπの値として「PI」を使わずに「3.1416」を使っていたからなのでした。そして、そのような状態でも、6問のうち5問まではクリアできてしまっていたので、そこが悪いことになかなか気付かなかったのでした。

思い起こしてみると、Cとかでも今までπや三角関数を使ってプログラムを書いたことが一度もありませんでした。円(楕円)を描くプログラムを作ったことはありますが、描くだけならせいぜい二乗とルートしか使いませんので。

さて、今回の問題は、3つの問題を合わせたものですが、第一問の角度を求める問題で早くも躓いてしまいました。色々と補助線を引いたりしましたが、なかなか解決方法がわからず、仕方がないのでネットで検索して求め方を拾ってきました。

次に第二問ですが、n を d で割った余りが 1 になるということは、d は n-1 の約数ということです。ということで、約数の合計を求めますが、約数のうち 1 だけは取り除く必要があるので 1 を引きます。

最後の第三問は、2つのステップに分けて計算することにしました。m の桁数未満の回文数の合計と、m の桁数と同じ桁数の回文数の合計です。まぁ、別に分けなくても充分時間には余裕があるようでしたが・・・。テストプログラムを作って走らせてみると、桁数未満の回文数合計は次のような結果となりました。

リミット値回文数合計桁増え増分
100 540
100050040+49500
10000545040+495000
10000050045040+49500000
1000000545045040+495000000
1000000050045045040+49500000000


この表からわかるように、1桁増えると増分は10倍と100倍を交互に繰り返しています。ということで、これを使えば、m の桁数未満の回文数合計は桁数回のループで計算できます。その後は、m の上半分の桁の数を増やしながら、それをリバースした数を後ろにくっつけます。ただし、m の桁数が奇数の場合はくっつける数の最初の桁を取り除きます。

文章での説明ではわかりづらいですが、ここまでの処理全てを Ruby で組んだのが以下のコードです。

実は、第三問の処理が自分で組んだのに何をやっているのか忘れてしまっていて、思い出すのに時間がかかってしまいました。

|

« 「ディビジョン・ナイン問題」の高度じゃないコード | トップページ | 「レッド・アンド・ホワイト問題」の高度じゃないコード »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/99795/63612746

この記事へのトラックバック一覧です: 「コード・トライアスロン2」の高度じゃないコード:

« 「ディビジョン・ナイン問題」の高度じゃないコード | トップページ | 「レッド・アンド・ホワイト問題」の高度じゃないコード »