美文网首页
求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