FInd模数不使用模数运算符

时间:2013-11-10 04:44:07

标签: php logic

使用模数运算符(%),我知道我可以在PHP中执行以下操作:

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

但是一个面试问题询问如何在不使用%运算符的情况下找到它来检查我的逻辑技能。我尝试了以下方法:

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

但这不起作用。有人可以提出解决方案吗?

4 个答案:

答案 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 :(得分:1)

我假设您正在尝试计算数字的模数而不使用模数运算符。嗯,这是如何手动完成的:

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

答案 2 :(得分:1)

假设两个$a都是$b个整数...

用数学:

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

演示:https://eval.in/65219

内置函数:

$c = (int) fmod($a, $b);
$c = (int) bcmod($a, $b);

答案 3 :(得分:0)

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

这将给出要求输出。循环运行直到$ a得到低于$ b。当$ a获得将分配给$ c的最小值时。这将是在不使用除法和模运算符

的情况下获得两个数的模数的输出