結果

問題 No.280 歯車の問題(1)
ユーザー くわいくわい
提出日時 2015-09-21 23:30:45
言語 Scala(Beta)
(3.4.0)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,545 bytes
コンパイル時間 8,578 ms
コンパイル使用メモリ 306,516 KB
最終ジャッジ日時 2024-04-27 02:11:25
合計ジャッジ時間 8,987 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
-- [E040] Syntax Error: Main.scala:48:32 ---------------------------------------
48 |  def main(args: Array[String]) {
   |                                ^
   |                                '=' expected, but '{' found
-- [E007] Type Mismatch Error: Main.scala:34:22 --------------------------------
34 |    reductionParent + "/" + reductionChild
   |                      ^^^
   |                      Found:    ("/" : String)
   |                      Required: BigDecimal
   |
   | longer explanation available when compiling with `-explain`
2 errors found

ソースコード

diff #

import scala.annotation.tailrec

object Problem280 {

  def proc(z: List[BigDecimal]) = {

    @tailrec
    def calcLastTheta(child: BigDecimal, parent: BigDecimal, z: List[BigDecimal]): (BigDecimal, BigDecimal) = {
      z match {
        case (head :: Nil) => (child, parent)
        case (head :: next :: tail) => {
          val c = child * head
          val p = parent * next

          // 毎回約分することで桁あふれを起こさない
          val g = gcd(c, p)
          val rc = c / g
          val rp = p / g
          calcLastTheta(rc, rp, z.tail)
        }
        case _ => throw new IllegalStateException("2 <= N <= 50なので起こり得ない")
      }
    }

    // θjを求める
    val (child, parent) = calcLastTheta(1, 1, z)

    // gcdで最大公約数求めて約分する
    val g = gcd(child, parent)
    val reductionChild = child / g
    val reductionParent = parent / g

    // 1/(child/parent) なので parent/child を表示
    reductionParent + "/" + reductionChild
  }

  @tailrec
  def gcd(m: BigDecimal, n: BigDecimal): BigDecimal = {
    if (n == 0) {
      m
    } else {
      gcd(n, m % n)
    }
  }

  //  N
  //  z1 z2 ... zN
  def main(args: Array[String]) {
    val N = scala.io.StdIn.readInt()
    val z = scala.io.StdIn.readLine().split(" ").map(x => BigDecimal(x)).toList

    val result = proc(z)
    println(result)
    // test
  }

  def test = {
    assert(proc(List(20, 40)) == "2/1")
    assert(proc(List(10, 10, 10)) == "1/1")
    assert(proc(List(20, 60)) == "3/1")
  }
}
0