Created
December 24, 2011 17:19
-
-
Save aoi0308/1517849 to your computer and use it in GitHub Desktop.
1000個の素数をファイルにカンマ区切りで各行10個ずつ出力するプログラム
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import scala.math | |
import java.io.{Writer, FileWriter} | |
/** | |
* 引数nが素数かどうかを判定します。 | |
* 引数psには√n以下の素数が全て含まれている必要があります。 | |
*/ | |
def isPrimeNumber(n: Int, ps: Seq[Int]): Boolean = { | |
require(n > 0) | |
val sqrt = math.sqrt(n).toInt | |
!ps.filter(_<=sqrt).exists(n%_==0) | |
} | |
/** | |
* lengthの長さの素数リストを返します。 | |
* 素数リストは昇順です。 | |
*/ | |
def createPrimeList(length: Int): List[Int] = { | |
require(length > 0) | |
val list = scala.collection.mutable.ArrayBuffer(2) | |
var n = 3 | |
while (list.size < length) { | |
if (isPrimeNumber(n, list)) list += n | |
n += 2 | |
} | |
list.toList | |
} | |
/** | |
* listの要素を10個カンマ区切りのリストにします。 | |
*/ | |
def make10[T](list: List[T]): List[String] = list.splitAt(10) match { | |
case (take10, Nil) => take10.mkString(",") :: Nil | |
case (take10, tail) => take10.mkString(",") :: make10(tail) | |
} | |
/** | |
* ローンパターンだよ。 | |
*/ | |
def using[A <: {def close()}, B](r: A)(f: A => B): B = { | |
try { | |
f(r) | |
} finally { | |
r.close() | |
} | |
} | |
/** | |
* 指定したファイルに指定した個数の素数をカンマ区切りで各行10個ずつ出力します。 | |
*/ | |
val fileName = "primenumber.txt" | |
val list = createPrimeList(1000) | |
using(new FileWriter(fileName)) { writer => | |
make10(list).foreach(writer.append(_).append("\n")) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment