2009-07-27 12 views
5

Das Problem gehen:insgesamt gegeben, zu bestimmen, wie oft ein Wert in sie

Eine Schachtel 53 Artikel halten kann. Wenn eine Person 56 Gegenstände hat, benötigt sie 2 Boxen, um sie zu halten. Box 1 werden 53 Elemente halten und 2 Feld 3.

halten Wie kann ich wiederhole die oben, wo 53 ist eine Konstante, unveränderlich, Wert und 56 ist eine Variable für jede Box:

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

was ich für das bisher haben ist:

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

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

Da '56' eine _total_ Anzahl von Elementen ist, ist es nicht sinnvoll, dass es eine" Variable für jede Box "ist. Meinst du vielleicht das Gegenteil - dass du die Gesamtzahl der Gegenstände kennst, aber jede Box einen anderen Wert haben kann (z. B. in einem Array gespeichert)? Ansonsten kann ich die Frage nicht wirklich verstehen ... –

+0

willst du wissen wie viele Boxen du brauchst, oder wie viele Artikel in deiner Restbox sind? – Jason

Antwort

16

Wo die ganzen Zahlen capacity und numItems Ihre Box Kapazität (53 im Beispiel) sind und die Gesamtzahl der Elemente, die Sie haben, verwenden Sie die folgenden zwei Berechnungen:

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

Dieser Wille geben Sie die Anzahl der Felder, die (numBoxes) gefüllt sind, und die Anzahl der Elemente in einem zusätzlichen Feld (remainder) falls erforderlich, da dieser Wert 0 sein könnte.

Edit: Wie Luke In den Kommentaren darauf hingewiesen, können Sie das gleiche Ergebnis mit der .NET-Klassenbibliothek Funktion Math.DivRem erhalten.

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

Diese Funktion gibt den Quotienten zurück und setzt den Rest in einen Ausgabeparameter.

+2

auch: Int Rest; int numBoxes = Math.DivRem (numItems, Kapazität, aus Rest); –

+0

@Luke: Fancy! Ich muss wirklich mehr .NET-Programmierung machen, um mich mit den allgemeinen Bibliotheksfunktionen vertraut zu machen. –

+0

Es ist nicht so, dass du es wirklich brauchst :) Gute Erklärung übrigens. –

6

einfach, allzu zwingend notwendig Beispiel:

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

Ich sehne mich nach Perl und es ist Listen-Syntax, wo ich tun kann (div, rem) = divRem (totalItems, itemsPerBox); Warum kann ich keine moderne imperative Sprache bekommen, um diese Syntax zu unterstützen? –

+0

Beats me ... es ist schwer genug, um Funktionen als erstklassige Objekte zu bekommen ... obwohl ich denke, Tupel-Unterstützung wäre einfacher zu implementieren. –

+0

@darthcoder - du meinst eins wie F #? Oder Python? –

1

Wenn ich die Frage richtig verstehe, werden alle Felder außer der letzten Box 53 Elemente enthalten, während die letzte Box intFeet% 53 (intFeet mod 53, oder der Rest nach der Division von intFeet und 53) enthalten wird.

Die Schleife ist jedoch nicht notwendig, um Ihre Frage zu beantworten;

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

unnötige Berechnung während jeder Schleife - nicht, dass es einen großen Unterschied zur Rechenzeit (oder dass es wichtig ist), aber es verringert die Klarheit und Lesbarkeit - es gibt keine Notwendigkeit, die Mod in der Schleife durchzuführen, wenn der Rest beibehalten wird (Siehe mein Beispiel). Aber ja, die meisten Leute scheinen zu fast das gleiche Ergebnis zu kommen :) –

+0

Ich wiederhole nicht den Modul. über ternäre Operatoren nachlesen – johnc

+1

Ich hätte schwören können, dass der Mod auf der LHS war, als ich es gelesen habe, mein Schlechter. Ich denke, es ist weniger sauber zu lesen, aber Sie sind völlig richtig. "Lies dir Ternäroperatoren durch" war ein bisschen ein böser Stich, da mein Beispiel eindeutig ein Ternär verwendet, aber ich vergebe dir. –

1

versuchen Sie es mit einem Modul?

x % y 
+0

Er ist eindeutig noch nicht auf dem Niveau, wo es klar ist, wie man es ohne ein bisschen mehr Hilfe richtig verwendet. Auch das Modulo-Symbol in C# ist% –

-1

Alle außer der letzten Box werden 53 Artikel haben. Um die Anzahl der vollen Kästchen und die Anzahl der Elemente im letzten Feld zu berechnen, suchen Sie nach ganzzahliger Division und Modul.

+0

Wenn das OP mehr will, dann fragen sie mich, ob sie für sie arbeiten sollen. – BCS

1

Verwenden Sie den Modulo-Operator, um den Rest zu bestimmen. Schnell Beispiel:

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); 
} 
Verwandte Themen