2

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

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

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

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

但这行不通。任何人都可以提出解决方案吗?

4

4 回答 4

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

测试代码(小提琴):

<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>
于 2013-11-10T05:26:16.320 回答
1

我假设您正在尝试在没有模数运算符的情况下计算数字的模数。好吧,这就是手动完成的方式:

while ($b <= $a) {
    $c = $a - $b;
    $a -= $b;
}
echo $c; // => 2
于 2013-11-10T04:55:16.080 回答
1

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

用数学:

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

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

内置功能:

$c = (int) fmod($a, $b);
$c = (int) bcmod($a, $b);
于 2013-11-10T06:28:29.190 回答
0
<?php
$a= 17;
$b = 3;
while ($b <= $a) {
$c = $a - $b;
$a = $a - $b;
}
echo $c; // => 2
?>

这将给出 Require 输出。循环运行直到 $a 小于 $b。当 $a 获得将分配给 $c 的最小值时。这将是在不使用除法和模运算符的情况下获得两个数字的模的输出

于 2013-11-13T10:42:14.810 回答