2010-01-19 26 views

risposta

99

Semplice:

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

L'operatore modulus dà il resto della divisione, in modo da $ numero% 6 è l'importo lasciato su quando dividendo per 6. Questo sarà più veloce di fare un ciclo e continuamente ricontrollando.

Se la diminuzione è accettabile, allora questo è ancora più veloce:

$number -= $number % 6; 
+0

Credo che dovrebbe funzionare anche questo? 'if (6% $ numero! = 0) {}' – thednp

+0

corretto ma richiede uno spazio% 6 – Smith

1

Utilizzare il Mod% (modulo) Operatore

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


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

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

Così si desidera che il prossimo multiplo di 6, è che esso?

È possibile dividere il proprio numero di 6, poi ceil esso, e moltiplicarlo ancora:

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

Questo è un algoritmo perspicace. – Karl

+5

Boo! Perché utilizzare il virgola mobile quando non è necessario! :) È anche non portabile, perché la divisione int/int in molte lingue darà un risultato intero (troncato), quindi ceil non vedrà mai la necessità di arrotondarlo al valore intero successivo, quindi l'espressione darà il risultato sbagliato –

+1

Secondo che, utilizzando il punto mobile per quello che è essenzialmente un problema intero è orribile e potrebbe non dare la risposta giusta in tutte le situazioni. – ZoFreX

1

semplicemente eseguire un ciclo while che continuerà a loop (e aumentare il numero) fino a quando il numero è divisibile per 6.

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

può essere fatto senza looping ... –

+0

Il metodo naive fa risparmiare tempo al programmatore e il mio capo/il cliente è sempre su questo. – Karl

0

Per appassionati di micro-ottimizzazione:

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

Altre valutazioni di %, ma meno ramificazioni/loop. :-P

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

senza bisogno di un ciclo while! Modulo (%) restituisce il resto di una divisione. IE 20% 6 = 2. 6-2 = 4. 20 + 4 = 24. 24 è divisibile per 6.

+0

Sicuro a tale proposito? : P – ZoFreX

+0

Penso che questo sia sbagliato - stai aggiungendo il resto al numero. Quindi se il numero era 8, il resto è 2, si aggiunge il resto da 2 a 8, per ottenere il risultato: 10. 10 non è divisibile per 6 –

+0

Ho corretto quell'errore di battitura letteralmente 5 secondi dopo aver postato questo ... – Ponkadoodle

0

Perché non usi lo Modulus Operator?

Prova questo:

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

O è questo quello che volevi dire?

<? 

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

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

Penso che questo sia sbagliato - stai aggiungendo il resto al numero. Quindi se il numero era 8, il resto è 2, si aggiunge il resto da 2 a 8, per ottenere il risultato: 10. 10 non è divisibile per 6. –

+0

Sì, avevo perso qualcosa. Corretto ora –

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

Fai divisibile per 6:

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

Il secondo operatore% è molto intelligente. Probabilmente più veloce del mio :( – ZoFreX

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

Questo non è del tutto corretto Sottrarre il resto da 6 prima di aggiungerlo! – ZoFreX

1

Supponendo $foo è un numero intero:

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

Vedo alcune delle altre risposte che chiamano il modulo due volte.

La mia preferenza è di non chiedere a php di fare la stessa cosa più di una volta. Per questo motivo, memorizzo il resto nella cache.

Altri sviluppatori potrebbero preferire non generare la variabile globale aggiuntiva o avere altre giustificazioni per utilizzare l'operatore modulo due volte.

Codice: (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"; 
} 

Possibile uscita:

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

Quanto tempo ci vuole per calcolare modulo? 1ns, forse 30 se stiamo parlando di float. pensi che ci voglia per immagazzinarlo in memoria e poi caricarlo? 2ns se sei fortunato, centinaia di ns se colpisce una cache che è già in uso e deve essere scaricata prima sulla RAM. per tutto ciò che PHP ha bisogno di fare per gestire una variabile: un buon compilatore userebbe i registri per entrambi, ma parliamo di una lingua in cui ogni variabile è un oggetto e l'assegnazione in condizionale è cattiva perché sembra un bug. –

+0

Questo è un downvote piuttosto scortese, non credi? Posso aggiungere spazi bianchi se vuoi.Ma questa risposta fornisce esiti corretti in un modo leggermente diverso dal resto. – mickmackusa

+1

e, naturalmente ... don ' t dimenticare il dif ference in time developer - molto più importante di un paio di ns spesi dalla CPU. –

Problemi correlati