2010-01-19 5 views

ответ

99

Простой:

if($number %6 != 0) { 
    $number += 6 - ($number % 6); 
} 

Оператор modulus дает остаток от деления, так что $ число% 6 это количество оставшихся при делении на 6. Это будет быстрее, чем делать петлю и постоянно перепроверяя.

Если уменьшение является приемлемым, то это еще быстрее:

$number -= $number % 6; 
+0

Я считаю, что это тоже должно работать? 'if (6% $ number! = 0) {}' – thednp

+0

правильно, но нужно пространство% 6 – Smith

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; 
} 
5

Итак, вы хотите следующее кратное 6, является то, что это?

Вы можете разделить число на 6, то ceil, и умножить его снова:

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

Это проницательное алгоритм. – Karl

+5

Бу! Зачем использовать с плавающей запятой, когда вам этого не нужно! :) Он также не переносится, потому что int/int деление на многих языках даст (усеченный) целочисленный результат, поэтому ceil никогда не увидит необходимости округлить его до следующего целочисленного значения, поэтому выражение даст неправильный результат. –

+1

Во-вторых, использование с плавающей запятой целочисленной проблемы является ужасным и не может дать правильный ответ во всех ситуациях. – ZoFreX

1

Просто запустите время цикл, который будет продолжать цикл (и увеличить число), пока число не делится на 6.

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

это можно сделать без цикла ... –

+0

Наивный метод экономит время программиста, а мой босс/клиент всегда об этом. – Karl

0

Для микро-оптимизации уродов:

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

Другие оценки %, но меньше разветвления/петли. :-P

6
$num += (6-$num%6)%6; 

не требуется цикл while! Modulo (%) возвращает остаток деления. IE 20% 6 = 2. 6-2 = 4. 20 + 4 = 24. 24 делится на 6.

+0

Уверен? : P – ZoFreX

+0

Я думаю, что это неправильно - вы добавляете остаток к числу. Поэтому, если число равно 8, остаток равен 2, вы добавляете остаток от 2 до 8, чтобы получить результат: 10. 10 не делится на 6 –

+0

Я исправил эту опечатку буквально через 5 секунд после того, как я разместил это сообщение ... – Ponkadoodle

0

Почему вы не используете Modulus Operator?

Попробуйте это:

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

Или это то, что вы имели в виду?

<? 

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

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

Я думаю, что это неправильно - вы добавляете остаток к числу. Поэтому, если число равно 8, остаток равен 2, вы добавляете остаток от 2 до 8, чтобы получить результат: 10. 10 не делится на 6. –

+0

Да, я что-то пропустил. Исправлено сейчас. –

15
if ($variable % 6 == 0) { 
    echo 'This number is divisible by 6.'; 
}: 

Марка делится на 6:

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

Второй% оператора очень умный. Вероятно, быстрее, чем у меня :( – ZoFreX

-1
result = initial number + (6 - initial number % 6) 
+0

Это не совсем правильно. Вычитайте остаток от 6 до его добавления! – ZoFreX

1

Предполагая, что $foo представляет собой целое число:

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

Я вижу некоторые другие ответы, которые вызывают по модулю дважды.

Мое предпочтение заключается в том, чтобы не просить php делать то же самое более одного раза. По этой причине я кэширую остаток.

Другие разработчики могут предпочесть не генерировать дополнительную глобальную переменную или иметь другие обоснования для использования оператора modulo дважды.

Код: (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 
+1

Как долго вы думаете, что нужно вычислить по модулю? 1ns, может быть, 30, если мы говорим о поплавках. вы считаете, что требуется сохранить его в память, а затем загрузить его? 2ns, если вам повезет, сотни нс, если он попадает на страницу кэша, которая уже используется, и ее сначала нужно сбрасывать в оперативную память. И это даже не считается для всего, что нужно сделать PHP для управления переменной. Хороший компилятор будет использовать регистры для обоих, но мы говорим о языке, где каждая переменная является объектом. И назначение в условных выражениях плохо, потому что оно выглядит как ошибка. –

+0

Это довольно грубое понижение, не так ли? Я могу добавить пробел, если хотите, но этот ответ дает правильные результаты в немного отличном от остальных – mickmackusa

+1

и, конечно же, забыть во время разработки - гораздо важнее, чем пара ns, потраченная процессором. –