hyoromoのブログ

最近はVRSNS向けに作ったものについて書いています

たのしいRuby 第10章 練習問題(P.180)

先日購入した参考書より、数値に関する練習問題。

(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

気にはなっていましたが、私が書いたものだと与えられる数値が多ければ多いほど処理に時間がかかります。
それに比べ、公式解答だと平方根を使用していますね。
もっと考えてから組むクセをつけなくては・・・