【问题标题】:FInd modulus without using modulus operator查找模数而不使用模数运算符
【发布时间】:2013-11-10 04:44:06
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • “没有运营商”是什么意思?大概你只想要echo 2;
  • @Mike W -->这是我的面试问题。我试过 但是面试官希望我在没有任何运算符的情况下获得输出。他只是检查我的逻辑能力。我没有通过
  • 有什么可否决的?
  • 也许你的面试官喜欢reinventing the wheels这个概念。
  • 为什么人们不赞成这个问题?我认为 Psychie 正在努力学习;提问是一个很好的方法。我认为这个问题非常有效,并展示了一些的努力。告诉他它与 PHP 编程工作没有任何相似之处对任何人都没有帮助。

标签: php logic


【解决方案1】:

另一种方法(没有循环,这使得大数字被小数字修改更快)

<?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>

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我很高兴,作为一名程序员,我真的不需要“得到”数学。
    • @Dagon:PHP 具有几乎一切的功能。 :)
    • 这是我永远的大满贯 :-)
    • 非常感谢@Amal Murali Y 是否有人反对我的问题? Wtz 错了
    • @jeff:是的,这就是为什么我特别提到modulus of a number without the modulus operator。 :)
    【解决方案3】:

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

    数学:

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

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

    内置函数:

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

    【讨论】:

      【解决方案4】:
      <?php
      $a= 17;
      $b = 3;
      while ($b <= $a) {
      $c = $a - $b;
      $a = $a - $b;
      }
      echo $c; // => 2
      ?>
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多