Se tutto è garantito per essere positivo, provare
multiple = baseNumber + number - 1;
multiple -= (multiple % number);
che lo fa in tempo costante.
Prima di tutto, aggiungiamo number - 1
per assicurarci di avere un numero almeno grande come il prossimo multiplo ma più piccolo di quello successivo. Quindi sottraiamo il resto della divisione per number
per assicurarci di avere il multiplo desiderato.
Se baseNumber
può essere negativo (ma number
ancora positiva), si affronta il problema che multiple % number
può essere negativo se multiple < 0
, la suddetta potrebbe saltare un multiplo di number
. Per evitare ciò, possiamo usare per es.
remainder = multiple % number;
if (remainder < 0) remainder += number;
multiple -= remainder;
Se ramificazione è troppo costoso, siamo in grado di evitare la if
al costo di due divisioni invece di uno,
multiple -= (number + (multiple % number)) % number;
In generale, il if
sembra preferibile, però.
Se number
può essere negativo, sostituirlo prima con il suo valore assoluto.
Nota: quanto sopra riportato, come fa il codice originale, baseNumber
se questo è già un multiplo di number
. Se ciò non è desiderato, rimuovere - 1
nella prima riga.
fonte
2012-07-27 17:43:26
Si potrebbe essere meglio chiedere questo al Matematica Stack Exchange. Potresti anche voler fornire una definizione più chiara o più rigorosa di cosa intendi per multiplo di un numero. – Jim