カメヲラボ

主にプログラミングとお勉強全般について書いてます

Steps(4)

もっとカシコーなやり方

私はsqrt関数を使う時、いつもint型にキャストしているので見落としてしまっていたのだが、double型のままで値を眺めていると超簡単なやり方があることに気付く。


sqrt( 0) * 2 = 0.0000000000
sqrt( 1) * 2 = 2.0000000000
sqrt( 2) * 2 = 2.8284271247
sqrt( 3) * 2 = 3.4641016151
sqrt( 4) * 2 = 4.0000000000
sqrt( 5) * 2 = 4.4721359550
sqrt( 6) * 2 = 4.8989794856
sqrt( 7) * 2 = 5.2915026221
sqrt( 8) * 2 = 5.6568542495
sqrt( 9) * 2 = 6.0000000000
sqrt(10) * 2 = 6.3245553203
sqrt(11) * 2 = 6.6332495807
sqrt(12) * 2 = 6.9282032303
sqrt(13) * 2 = 7.2111025509
sqrt(14) * 2 = 7.4833147735
sqrt(15) * 2 = 7.7459666924
sqrt(16) * 2 = 8.0000000000
sqrt(17) * 2 = 8.2462112512
sqrt(18) * 2 = 8.4852813742
sqrt(19) * 2 = 8.7177978871
sqrt(20) * 2 = 8.9442719100


整数部分だけだと、「1,4,9,16...の時だけ1多くなるから引かないといけない、しかしその処理が冗長だなぁ」と思ってしまうのだが、上記の表を見ると1でなくても0.0000001くらい引くだけでかまわないことがわかる。他の値の場合に影響しないほどの小さな数であれば、場合分けの必要がないということだ。


この問題のテストケースの中には、結構キワドイ入力も含まれているようで、0.1とか0.01くらいではWAになってしまう。どんなに大きくても0.0001を引かなければならない。