Вот проблема, когда он встречает дроби вроде: 300/10 вместо того, чтобы давать результат «30», следующий код дает мне: 1/0
$tokens = explode('/', $value);
while ($tokens[0] % 10 == 0) {
$tokens[0] = $tokens[0] / 10;
$tokens[1] = $tokens[1] / 10;
}
if ($tokens[1] == 1) {
return $tokens[0].' s';
} else {
return '1/'.floor(1/($tokens[0]/$tokens[1])).' s';
// return $tokens[0].'/'.$tokens[1].' s';
}
Спасибо
Вы должны изменить строку while($tokens[0] % 10 === 0 && $tokens[1] % 10 === 0) {
в while($tokens[0] % 10 === 0 && $tokens[1] % 10 === 0) {
,
И линия return '1/'.floor(1/($tokens[0]/$tokens[1])).' s';
не надежно
Если вы хотите уменьшить дроби, попробуйте эту функцию:
function reduceFraction($fraction) {
sscanf($fraction, '%d/%d %s', $numerator, $denominator, $junk);
// TODO: validation
if( $denominator === null ) {
return (string)$numerator;
}
if( $numerator === $denominator ) {
return 1;
}
$max = max(array($numerator, $denominator));
for($i = 1; $i < $max; ++$i) {
if( $denominator % $i === 0 && $numerator % $i === 0) {
$common = $i;
}
}
if( $denominator === $common ) {
return (string)($numerator / $common);
}
return ($numerator / $common) . '/' . ($denominator / $common);
}
Вы можете использовать это так:
ReductionFraction (‘300/10’). ‘s’;
Также возможно обобщить функцию для цепных дробей (например: «300/100/10»). Я могу отправить реализацию этого, если вы хотите.
скажите мне почему «while ($ tokens [0]% 10 == 0» && $ tokens [1]% 10 == 0) «лучше использовать, чем просто» while ($ tokens [0]% 100 == 0) «, так как
оба метода работают нормально
Если вы попытаетесь использовать строку «3000/10» в качестве аргумента для каждой реализации, то с while ($tokens[0] % 10 == 0 && $tokens[1] % 10 ==0)
вернусь 300 s
, а другой с while ($tokens[0] % 100 == 0)
вернусь 1/0 s
,
Если вы используете while ($tokens[0] % 100 == 0)
Метод, итерации цикла:
$tokens[0] = 3000 / 10 = 300;
$tokens[1] = 10 / 10 = 10;
$tokens[0] = 30 / 10 = 30;
$tokens[1] = 10 / 1 = .1;
Если вы используете while ($tokens[0] % 10 == 0 && $tokens[1] % 10 == 0)
Метод, итерации цикла:
$tokens[0] = 3000 / 10 = 300;
$tokens[1] = 10 / 10 = 1;
Это лучше, потому что он будет работать с большим количеством входов.
Но я рекомендую вам использовать функцию «reduFraction», которую я реализовал.
Он использует метод максимального общего знаменателя для сокращения функций.
echo reduceFraction('3000/10');
выходы «300».echo reduceFraction('300/10');
выходы «30».echo reduceFraction('30/10');
выходы «3».echo reduceFraction('3/10');
выходы «3/10».echo reduceFraction('3/3');
выходы «1».echo reduceFraction('222/444');
выходы «1/2».echo reduceFraction('444/222');
выходы «2».