要求:給定2個數(整數或小數均可),相除得到結果,如果結果有循環節,請打印出其循環節。
<?php
// 求$num1/$num2的循環節
function getAnswer($num1, $num2, &$result = [], &$hash = []) {
$num1 = ftoi($num1);
$num2 = ftoi($num2);
$z = (int)($num1/$num2);
$yushu = $num1%$num2;
// 若余數為0,則除盡,無循環節,返回false
if (!$yushu) {
return false;
}
// 將除得的整數結果存起來
$result[] = $z;
// 判斷余數是否重復出現過,如果出現過,說明循環節已經重新開始了新一輪,返回循環節
if (isset($hash['_' . $yushu]) && $hash['_' . $yushu]) {
$length = count($hash);
return array_slice($result, count($result)-$length);
}
else {
$hash["_" . $yushu] = true;
// 將余數乘10,得到剛好比除數大的整數
while ($yushu < $num2) {
$yushu *= 10;
// 如果余數乘10之后還是小于除數$num2,則結果需要增加一位0
if ($yushu < $num2) {
$result[] = 0;
}
}
// 遞歸調用該函數求得答案
return getAnswer($yushu, $num2, $result, $hash);
}
}
// 將小數轉換為整數
function ftoi($num) {
$sNum = $num + '';
if (!strpos($sNum, ".")) {
return $num;
}
else {
$num *= 10;
return ftoi($num);
}
}
$res = getAnswer(0.000218,0.7);
var_dump($res);