Skip to content

Instantly share code, notes, and snippets.

@aoi0308
Created December 24, 2011 17:19
Show Gist options
  • Save aoi0308/1517849 to your computer and use it in GitHub Desktop.
Save aoi0308/1517849 to your computer and use it in GitHub Desktop.
1000個の素数をファイルにカンマ区切りで各行10個ずつ出力するプログラム
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