2009-07-27 11 views
5

Il problema:ottenuto un totale, determinare quante volte un valore andrà in esso

Una scatola può contenere 53 voci. Se una persona ha 56 oggetti, richiederà 2 scatole per tenerli. Scatola 1 terrà 53 articoli e scatola 2 conterrà 3.

Come ripetere quanto sopra dove 53 è una costante, immutabile, valore e 56 è una variabile per scatola:

Math.Ceiling(Convert.ToDecimal(intFeet/53)) 

quello che ho finora per quello è:

int TotalItems = 56; 
int Boxes = Math.Ceiling(Convert.ToDecimal(intFeet/53)); 

for (int i = 0; i < Boxes; i++) 
{ 
    int itemsincurrentbox=?? 
} 
+0

Dato che '56' è un numero _totale_ di elementi, non ha senso che sia una" variabile per ogni casella ". Intendi forse il contrario: che conosci il numero totale di elementi, ma ogni casella può contenere una quantità diversa (ad esempio, memorizzata in un array)? Altrimenti non riesco proprio a capire la domanda ... –

+0

vuoi sapere di quante scatole hai bisogno, o solo quanti oggetti ci sono nella tua casella resto? – Jason

risposta

16

Dove gli interi capacity e numItems sono la capacità di dialogo (53 nell'esempio) e il numero totale di elementi che hai, utilizzare i seguenti due calcoli:

int numBoxes = numItems/capacity; 
int remainder = numItems % capacity; 

Questa volontà fornisci il numero di caselle riempite (numBoxes) e il numero di elementi in una casella aggiuntiva (remainder) se necessario, poiché questo valore potrebbe essere 0.

Modifica: As Luke sottolineato nei commenti, è possibile ottenere lo stesso risultato con la funzione libreria di classi .NET Math.DivRem.

int remainder; 
int numBoxes = Math.DivRem(numItems, capacity, out remainder); 

Questa funzione restituisce il quoziente e inserisce il resto in un parametro di output.

+2

anche: int resto; int numBoxes = Math.DivRem (numItems, capacity, out restante); –

+0

@Luke: Fantasia! Ho davvero bisogno di fare più programmazione .NET per familiarizzare con le funzioni di libreria comuni. –

+0

Non è che tu ne abbia davvero bisogno anche se :) Buona spiegazione a proposito. –

6

semplice, ad esempio eccessivamente imperativo:

int itemsPerBox = 53; 
int totalItems = 56; 
int remainder = 0; 
int boxes = Math.DivRem(totalItems, itemsPerBox, out remainder); 
for(int i = 0; i <= boxes; i++){ 
    int itemsincurrentbox = i == boxes ? remainder : itemsPerBox; 
} 
+0

I yearn per Perl e la sintassi delle liste dove posso fare (div, rem) = divRem (totalItems, itemsPerBox); Perché non riesco a ottenere un linguaggio imperativo moderno per supportare questa sintassi? –

+0

Mi colpisce ... è abbastanza difficile ottenere funzioni come oggetti di prima classe ... anche se penso che il supporto a tuple sarebbe più facile da implementare. –

+0

@darthcoder - vuoi dire uno come F #? O Python? –

1

Se ho capito bene la domanda, tutte le caselle tranne l'ultima casella contengono 53 elementi, mentre l'ultima casella contiene intFeet% 53 (intFeet mod 53, o il resto dopo la divisione di intFeet e 53).

Il ciclo non è necessario, tuttavia, per rispondere alla domanda;

int totalItems = 56; 
int boxes = Math.Ceiling(Convert.ToDecimal(totalItems/53)) + 1; 
for(int i=0; i< boxes;i++) 
{ 
    int numberInBoxes = i != boxes -1 ? 53 : totalItems % 53; 
} 
+0

calcolo non necessario durante ogni ciclo - non che farà molta differenza per il tempo di calcolo (o che sia importante), ma diminuisce la chiarezza e la leggibilità - non è necessario eseguire la mod nel ciclo se il resto viene mantenuto (vedi il mio esempio). Ma sì, molte persone sembrano arrivare più o meno allo stesso risultato :) –

+0

Non sto ripetendo il modulo. leggere su operatori ternari – johnc

+1

Avrei potuto giurare che il mod era sul LHS quando l'ho letto, il mio male. Penso che sia meno pulito da leggere, ma tu sei totalmente corretto. 'Leggi su operatori ternari' era un po 'una pugnalata malvagia, dato che il mio esempio usa chiaramente un ternario, ma ti perdono. –

1

provare a utilizzare un modulo?

x % y 
+0

Ovviamente non è ancora al livello in cui è chiaro come usarlo correttamente senza un po 'più di aiuto. Inoltre, il simbolo del modulo in C# è% –

-1

Tutti tranne l'ultima casella avranno 53 articoli. Per quanto riguarda il calcolo del numero di caselle complete e il numero di elementi nell'ultima casella, cercare la divisione e il modulo intero.

+0

Se l'OP vuole di più, mi chiedono di fare il lavoro per loro. – BCS

1

Utilizzare l'operatore modulo per determinare il resto. rapido esempio:

int totalBoxes = Math.Ceiling(Convert.ToDecimal(intFeet/53)); 

List<int> boxes = new List<int>(); 
for (int i=0; i< totalBoxes; i++) 
{ 
    if (i == totalBoxes-1) 
     boxes.Add(intFeet % 53) 
    else 
     boxes.Add(53); 
} 
Problemi correlati