Skip to content

Instantly share code, notes, and snippets.

@nogitsune413
Created May 30, 2017 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nogitsune413/eebffc4f186eba3829e81e56a527b76e to your computer and use it in GitHub Desktop.
Save nogitsune413/eebffc4f186eba3829e81e56a527b76e to your computer and use it in GitHub Desktop.
フロイドの循環検出法を使って、有理数から循環小数を算出する。(仕掛中)
import scala.annotation.tailrec
/**
* Created by nakam on 2017/05/29.
*/
object Test {
def main(args: Array[String]): Unit = {
val dividend = 9 // 割られる数
val divisor = 74 // 割る数
val result = getM(new Remainder(dividend % divisor,0), new Remainder(dividend % divisor,0), divisor)
printf("M:%d%n",result)
}
@tailrec
def getM(pointerA:Remainder, pointerB:Remainder, divisor:Int): Int ={
val resultA = divideRemainder(pointerA, divisor)
val resultB = divideRemainder(pointerB, divisor,2)
if(resultA.number == resultB.number){
resultA.index
} else {
getM(resultA, resultB, divisor)
}
}
/**
* 余りを割る計算を指定した回数行う。
* @param remainder 余り
* @param divisor 割る数
* @param time 割り算の回数
* @return 割り算の結果
*/
@tailrec
def divideRemainder(remainder: Remainder, divisor:Int,time:Int):Remainder ={
val newRemainder:Remainder = divideRemainder(remainder, divisor)
if(time == 1) {
newRemainder
} else {
divideRemainder(newRemainder, divisor, time - 1)
}
}
/** 前回の計算の余りを割る。(次の余りを得る)
* @param remainder 割られる数
* @param divisor 割る数
* @return 割り算の結果
*/
def divideRemainder(remainder: Remainder, divisor:Int): Remainder ={
new Remainder(remainder.number * 10 % divisor, remainder.index + 1)
}
}
/**
* 余り
* @param number 余り
* @param index 添え字
*/
class Remainder(val number:Int, val index:Int)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment