检查一个数字是不是能被 6 PHP 整除

Posted

技术标签:

【中文标题】检查一个数字是不是能被 6 PHP 整除【英文标题】:checking if a number is divisible by 6 PHP检查一个数字是否能被 6 PHP 整除 【发布时间】:2011-01-06 14:57:10 【问题描述】:

我想检查一个数字是否能被 6 整除,如果不能被 6 整除,我需要增加它直到它可以被整除。

我该怎么做?

【问题讨论】:

【参考方案1】:

使用Mod %(模数)运算符

if ($x % 6 == 0) return 1;


function nearest_multiple_of_6($x) 
    if ($x % 6 == 0) return $x;    

    return (($x / 6) + 1) * 6;

【讨论】:

【参考方案2】:

所以你想要下一个 6 的倍数,是吗?

你可以将你的数字除以 6,然后 ceil 它,然后再乘一次:

$answer = ceil($foo / 6) * 6;

【讨论】:

这是一个有见地的算法。 嘘!为什么在不需要的时候使用浮点数! :) 它也是不可移植的,因为许多语言中的 int/int 除法会给出(截断的)整数结果,因此 ceil 永远不会看到需要将其向上舍入到下一个整数值,因此表达式会给出错误结果。 我认为,对于本质上是整数的问题使用浮点是可怕的,并且可能无法在所有情况下都给出正确的答案。 我认为在这种情况下选择不使用模运算符有点奇怪......【参考方案3】:

只需运行一个 while 循环,它将继续循环(并增加数字),直到数字可以被 6 整除。

while ($number % 6 != 0) 
    $number++;

【讨论】:

天真的方法节省了程序员的时间,我的老板/客户总是在这方面。【参考方案4】:

对于微优化狂:

if ($num % 6 != 0)
    $num += 6 - $num % 6;

更多对% 的评估,但更少的分支/循环。 :-P

【讨论】:

【参考方案5】:
$num += (6-$num%6)%6;

不需要while循环!模 (%) 返回除法的余数。 IE 20%6 = 2. 6-2 = 4. 20+4 = 24. 24 可以被 6 整除。

【讨论】:

我认为这是错误的 - 您将余数添加到数字中。所以如果数字是8,余数是2,你把余数2加到8,得到结果:10。10不能被6整除 如果它已经能被 6 整除,这将在数字上加 6。【参考方案6】:

你为什么不使用Modulus Operator?

试试这个:

while ($s % 6 != 0) $s++;

或者这就是你的意思?

<?

 $s= <some_number>;
 $k= $s % 6;

 if($k !=0)    $s=$s+6-$k;
?>

【讨论】:

我认为这是错误的 - 您将余数添加到数字中。所以如果数字是 8,余数是 2,你将余数 2 加到 8,得到结果:10。10 不能被 6 整除。 是的,我错过了一些东西。现已更正。【参考方案7】:
if ($variable % 6 == 0) 
    echo 'This number is divisible by 6.';
:

能被 6 整除:

$variable += (6 - ($variable % 6)) % 6; // faster than while for large divisors

【讨论】:

第二个 % 运算符非常聪明。可能比我的快:(【参考方案8】:
if ($number % 6 != 0) 
  $number += 6 - ($number % 6);

modulus 运算符给出除法的余数,因此 $number % 6 是除以 6 时的余数。这比循环并不断重新检查要快。

如果减少是可以接受的,那么这会更快:

$number -= $number % 6;

【讨论】:

我相信这也应该有效? if( 6 % $number != 0) 【参考方案9】:
result = initial number + (6 - initial number % 6)

【讨论】:

这不太正确。在添加之前从 6 中减去余数!【参考方案10】:

假设$foo 是一个整数:

$answer = (int) (floor(($foo + 5) / 6) * 6)

【讨论】:

【参考方案11】:

我看到其他一些答案调用模数两次。

我的偏好是不要让 php 多次做同样的事情。出于这个原因,我缓存了其余部分。

其他开发人员可能更愿意不生成额外的全局变量或有其他理由使用两次模运算符。

代码:(Demo)

$factor = 6;
for($x = 0; $x < 10; ++$x)  // battery of 10 tests
    $number = rand( 0 , 100 );
    echo "Number: $number Becomes: ";
    if( $remainder = $number % $factor )   // if not zero
        $number += $factor - $remainder;  // use cached $remainder instead of calculating again
    
    echo "$number\n";

可能的输出:

Number: 80 Becomes: 84
Number: 57 Becomes: 60
Number: 94 Becomes: 96
Number: 48 Becomes: 48
Number: 80 Becomes: 84
Number: 36 Becomes: 36
Number: 17 Becomes: 18
Number: 41 Becomes: 42
Number: 3 Becomes: 6
Number: 64 Becomes: 66

【讨论】:

你认为计算模数需要多长时间? 1ns,如果我们谈论浮点数,可能是 30。您认为将其存储到内存然后加载它需要多长时间? 2ns 如果你很幸运,数百 ns 如果它遇到一个已经在使用并且需要先转储到 RAM 的缓存页面。这甚至不包括 PHP 需要做的所有事情来管理变量。一个好的编译器会为两者都使用寄存器,但我们谈论的是一种语言,其中每个变量都是一个对象。条件中的赋值很糟糕,因为它看起来像一个错误。另外,请留白。 当然...不要忘记开发人员时间的差异 - 比 CPU 花费几个 ns 更重要。 “正确的结果”并不是做出有用答案的唯一标准。并非所有东西都需要彻底干燥。 DRY 是制作可读代码的工具。缓存模数是否会使您的代码更具可读性? 投反对票是评估答案有用性的一种方式。他们没有什么粗鲁的。另外,你为什么认为这是我的反对票? 我的意思是:过度使用 DRY 会使代码变得更糟。您的代码是一个边缘案例,只添加了一行来缓存模数,但该策略的受害者要严重得多,这就是为什么我认为一个简单的“干掉所有东西”是一个坏建议。

以上是关于检查一个数字是不是能被 6 PHP 整除的主要内容,如果未能解决你的问题,请参考以下文章

如何检查数字是不是可以被另一个Python整除

检查一个数字是不是可以被另一个整除的快速方法?

汇编语言,检查数字是不是可被 2 整除并在循环中打印数字的程序

3-素数对中间的数能被6整除

PHP趣味题

一些数的整除问题