結果
| 問題 |
No.280 歯車の問題(1)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-09-21 23:30:45 |
| 言語 | Scala(Beta) (3.6.2) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,545 bytes |
| コンパイル時間 | 8,127 ms |
| コンパイル使用メモリ | 291,204 KB |
| 最終ジャッジ日時 | 2024-11-14 19:14:40 |
| 合計ジャッジ時間 | 8,535 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
[31m[31m-- [E040] Syntax Error: Main.scala:48:32 ---------------------------------------[0m[0m
[31m48 |[0m [33mdef[0m [36mmain[0m([36margs[0m: [35mArray[0m[[35mString[0m]) {
[31m[31m |[0m ^[0m
[31m |[0m '=' expected, but '{' found
[31m[31m-- [E007] Type Mismatch Error: Main.scala:34:22 --------------------------------[0m[0m
[31m34 |[0m reductionParent + [31m"/"[0m + reductionChild
[31m[31m |[0m ^^^[0m
[31m |[0m Found: ([32m"/"[0m : String)
[31m |[0m Required: BigDecimal
[31m |[0m
[31m |[0m longer explanation available when compiling with `-explain`
2 errors found
ソースコード
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")
}
}