結果

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

コンパイルメッセージ
-- [E040] Syntax Error: Main.scala:48:32 ---------------------------------------
48 |  def main(args: Array[String]) {
   |                                ^
   |                                '=' expected, but '{' found
1 error found

ソースコード

diff #

import scala.annotation.tailrec

object Problem280 {

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

    @tailrec
    def calcLastTheta(child: Long, parent: Long, z: List[Long]): (Long, Long) = {
      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: Long, n: Long): Long = {
    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(_.toLong).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