要求:给定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);
网友评论