Created
May 30, 2017 14:15
-
-
Save nogitsune413/eebffc4f186eba3829e81e56a527b76e to your computer and use it in GitHub Desktop.
フロイドの循環検出法を使って、有理数から循環小数を算出する。(仕掛中)
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.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