Voglio verificare se un numero è divisibile per 6 e se non è necessario aumentarlo finché diventa divisibile.verifica se un numero è divisibile per 6 PHP
come posso farlo?
Voglio verificare se un numero è divisibile per 6 e se non è necessario aumentarlo finché diventa divisibile.verifica se un numero è divisibile per 6 PHP
come posso farlo?
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;
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;
}
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;
Questo è un algoritmo perspicace. – Karl
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 –
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
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++;
}
può essere fatto senza looping ... –
Il metodo naive fa risparmiare tempo al programmatore e il mio capo/il cliente è sempre su questo. – Karl
Per appassionati di micro-ottimizzazione:
if ($num % 6 != 0)
$num += 6 - $num % 6;
Altre valutazioni di %
, ma meno ramificazioni/loop. :-P
$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.
Sicuro a tale proposito? : P – ZoFreX
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 –
Ho corretto quell'errore di battitura letteralmente 5 secondi dopo aver postato questo ... – Ponkadoodle
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;
?>
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. –
Sì, avevo perso qualcosa. Corretto ora –
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
Il secondo operatore% è molto intelligente. Probabilmente più veloce del mio :( – ZoFreX
result = initial number + (6 - initial number % 6)
Questo non è del tutto corretto Sottrarre il resto da 6 prima di aggiungerlo! – ZoFreX
Supponendo $foo
è un numero intero:
$answer = (int) (floor(($foo + 5)/6) * 6)
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
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. –
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
e, naturalmente ... don ' t dimenticare il dif ference in time developer - molto più importante di un paio di ns spesi dalla CPU. –
Credo che dovrebbe funzionare anche questo? 'if (6% $ numero! = 0) {}' – thednp
corretto ma richiede uno spazio% 6 – Smith