2013-11-10 2 views
2

Используя оператор модуля (%), я знаю, что могу сделать следующее в PHP:НАХОДИМСЯ модуль без использования модуль оператора

<?php 
$a= 17; 
$b = 3; 
$c = $a % $b; 
echo $c; // => 2 
?> 

Но вопрос интервью вопрос, как найти его, не используя оператор % проверить мои логические навыки. Я пробовал следующее:

<?php 
$c = $a/$b; 
$res = $c * $b; 
$output = $a - $res; //2 
?> 

Но это не работает. Может ли кто-нибудь предложить решение?

+1

Что вы подразумеваете под «без операторов»? Предположительно, вы просто хотите 'echo 2;' –

+1

@Mike W -> Это мой вопрос для интервью. Я пробовал как Но интервьюер ожидает, что я получу выход без какого-либо оператора. он просто проверяет мои логические навыки. Я не смог пройти –

+1

Что там, чтобы понизить? –

ответ

1

Я предполагаю, что вы пытаетесь вычислить модуль числа без оператор модуля. Ну, вот как это можно сделать вручную:

while ($b <= $a) { 
    $c = $a - $b; 
    $a -= $b; 
} 
echo $c; // => 2 
+2

im рада, как программист, мне действительно не нужно «получать» математику. –

+0

@Dagon: PHP имеет функции почти * все *. :) –

+0

, который я ВЕЧНО большой, полный для :-) –

2

Другой метод (без зацикливания, что делает его быстрее для большого количества будучи модом небольшим числом)

<?php 
    $a= 17; 
    $b = 3; 
    $c = ($a/$b - (int)($a/$b)) * $b; 
    echo $c; // => 2 
?> 

Сравнение скорости:

Looping time (17 % 3): 0.0000209808349609375 
no-Loop time (17 % 3): 0.0000140666961669921875 

Looping time (177777777 % 3): 3.370441913604736328125 
no-Loop time (177777777 % 3): 0.00000286102294921875 

код испытания (fiddle):

<pre> 
<?php 

    $a= 17; 
    $b = 3; 
    $starttime = microtime(true); 
    while ($b <= $a) { 
     $c = $a - $b; 
     $a -= $b; 
    } 
    $endtime = microtime(true); 
    echo rtrim(sprintf('Looping time (17 %% 3): %.50F', $endtime - $starttime), "0"); 

    echo "<br />"; 

    $a= 17; 
    $b = 3; 
    $starttime = microtime(true); 
$c = ($a/$b - (int)($a/$b)) * $b; 
    $endtime = microtime(true); 
    echo rtrim(sprintf('no-Loop time (17 %% 3): %.50F', $endtime - $starttime), "0"); 


echo "<br /><br />"; 

    $a= 177777777; 
    $b = 3; 
    $starttime = microtime(true); 
    while ($b <= $a) { 
     $c = $a - $b; 
     $a -= $b; 
    } 
    $endtime = microtime(true); 
    echo rtrim(sprintf('Looping time (177777777 %% 3): %.50F', $endtime - $starttime), "0"); 

    echo "<br />"; 

    $a= 177777777; 
    $b = 3; 
    $starttime = microtime(true); 
$c = ($a/$b - (int)($a/$b)) * $b; 
    $endtime = microtime(true); 
    echo rtrim(sprintf('no-Loop time (177777777 %% 3): %.50F', $endtime - $starttime), "0"); 
?> 
</pre> 
1

Предполагая, что обе $a являются $b целые ...

С математикой:

$c = $a - intval($a/$b) * $b; 

Демо: https://eval.in/65219

С встроенными функциями:

$c = (int) fmod($a, $b); 
$c = (int) bcmod($a, $b); 
0
<?php 
$a= 17; 
$b = 3; 
while ($b <= $a) { 
$c = $a - $b; 
$a = $a - $b; 
} 
echo $c; // => 2 
?> 

Это будет Дайте требуемый результат. Loop Runs До $ a получается меньше $ b. Когда $ a получает минимальное значение, которое будет присвоено $ c. Это будет выход для получения по модулю двух чисел без использования деления и оператора modulo.

+1

Я уже получил выход –

Смежные вопросы