先日購入した参考書より、数値に関する練習問題。
(1)「華氏を求めよ」という問題。式は「華氏 = 摂氏 * 9 / 5 + 32」
def cels2fahr(cels) fahr = cels * 9 / 5 + 32 end p cels2fahr(ARGV[0].to_i)
さすがにこれくらいはできる!と思いきや、小数点が考慮されていませんでした。
こちらが公式の解答
def cels2fahr(cels) return Float(cels) * 9 / 5 + 32 end
(2)「(1)とは逆に摂氏を求めよ」という問題。
def fahr2cels (fahr) # 摂氏 = (華氏 - 32) * 5 / 9 cels = (fahr - 32) * 5 / 9 end p fahr2cels(ARGV[0].to_i)
こちらも同じく小数点が考慮されていませんでした。
こちらが公式の解答
def fahr2cels(fahr) return (Float(fahr) - 32) * 5 / 9 end
(3)「乱数メソッドを使用して、1から6までの数字をランダムに返すメソッドを定義せよ」
def dice rand(6) + 1 end p dice
これは簡単でした。
一応公式の解答はこちら
def dice return rand(6) + 1 end
(4)「素数かどうかをチェックするメソッドを定義せよ」
def prime?(num) # 2以下の数値は素数ではない if (num < 2) return false end # 2から素数かのチェックを開始 2.upto(num-1){ |i| if (num % i) == 0 return false end } return true end if prime?(ARGV[0].to_i) == true printf "素数である" else printf "素数でない" end
初めて数え上げするメソッドを使ってみましたが、途中で様々な括弧が出てきたため、一か所記述ミスし、そのデバックに時間がかかりました。
こちらが公式回答。
def prime?(num) return false if num < 2 2.upto(Math.sqrt(num)){|i| if num % i == 0 return false end } return true end
気にはなっていましたが、私が書いたものだと与えられる数値が多ければ多いほど処理に時間がかかります。
それに比べ、公式解答だと平方根を使用していますね。
もっと考えてから組むクセをつけなくては・・・