美文网首页
求2个数相除的循环节

求2个数相除的循环节

作者: PYM_祺 | 来源:发表于2018-01-09 11:44 被阅读0次

要求:给定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);

相关文章

网友评论

      本文标题:求2个数相除的循环节

      本文链接:https://www.haomeiwen.com/subject/ybywnxtx.html