使用模数运算符(%
),我知道我可以在PHP中执行以下操作:
<?php
$a= 17;
$b = 3;
$c = $a % $b;
echo $c; // => 2
?>
但是一个面试问题询问如何在不使用%
运算符的情况下找到它来检查我的逻辑技能。我尝试了以下方法:
<?php
$c = $a/$b;
$res = $c * $b;
$output = $a - $res; //2
?>
但这不起作用。有人可以提出解决方案吗?
答案 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;
内置函数:
$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的最小值时。这将是在不使用除法和模运算符
的情况下获得两个数的模数的输出