2009-08-08 11 views
2

Ich habe ein Problem (möglicherweise aufgrund von Schlafmangel!), Wo ich versuche, ein mathematisches Problem in C# zu lösen.Round Robin in C#

Nehmen wir an, ich habe eine Getränkemaschine, und ich habe drei leere Reihen, die mit Cola gefüllt werden können. Ich habe 17 Dosen Cola in meiner Hand und ich muss jede Reihe einzeln füllen.

Zum Beispiel ...

Pass 1:

hinzufügen Cola 1. Drinks = 1
hinzufügen Cola 2. Getränke = 1
hinzufügen Cola 3 bis Zeile Zeile Zeile. Getränke = 1

Pass 2:

hinzufügen Cola 1. Getränke = 2
Reihe Cola hinzufügen 2. Getränke auf Zeile = 2
Cola hinzufügen 3. Getränke = 2

...

Pass 6

auf Zeile

hinzufügen Cola 1. Getränke auf Zeile = 6
Cola hinzufügen 2. Getränke auf Zeile = 6
hinzufügen Cola 3. Getränke = 5 (nicht mehr Getränke an dieser Stelle links) Reihe

Aus irgendeinem Grund bin ich völlig verloren. Kann jemand helfen?!

+2

Ihr Mangel an Schlaf hat man immer von tatsächlich eine Frage aufwirft es scheint. Was versuchst du zu machen? –

+0

Lol! Schreibe den Code. :) –

+3

??? 'Int Dosen = 17; while (Dosen <-1) {...} '??? –

Antwort

4

Ziemlich schnell und schmerzlos, und erfordert nur eine Schleife, nicht zwei verschachtelte Schleifen. Alles, was Sie brauchen, ist ein wenig Mathematik den richtigen Index des Arrays zu erhalten:

int[] Cola = {0,0,0}; 
int Rows = Cola.Length; 
int Drinks = 17; 

for (int i = Drinks; i > 0; i--) 
{ 
    Cola[(Drinks - i) % Rows]++; 
} 

Console.WriteLine("Row 1 has " + Cola[0] + " cans."); 
Console.WriteLine("Row 2 has " + Cola[1] + " cans."); 
Console.WriteLine("Row 3 has " + Cola[2] + " cans."); 

Dies ergibt dies als Ausgabe:

Row 1 has 6 cans. 
Row 2 has 6 cans. 
Row 3 has 5 cans. 
+0

Weißt du, das ist absolut richtig! –

+0

Vielen Dank für Ihre Antwort! –

+0

Ziemlich willkommen, froh, dass es geholfen hat. Viel Spaß und viel Glück. – Eric

1

aus der Hüfte schießen:

int numDrinks = /* Your constant here */ 
int[] drinksInRow = new int[NUM_ROWS]; 
for(int i = 0; i < drinksInRow.Length; i++) 
{ 
    drinksInRow[i] = numDrinks/NUM_ROWS; 
    if(i < numDrinks % NUM_ROWS) drinksInRow[i]++; 
} 

Anzahl der Getränke in jeder Zeile ist in drinksInRow, indexiert durch Reihennummer beginnend mit 0.

Dies ist schneller als wiederholte Durchgänge machen; Grundsätzlich ist es O (NUM_ROWS) [wenn wirklich lose mit Big-O] spielen.

2

Statt Looping eine Dose zu einem Zeitpunkt hinzufügen, können Sie berechnen, wie viele Dosen jede Zeile erhalten:

int cans = 17; 
cans += machine.Rows.Count; 
for(int i = 1; i <= machine.Rows.Count; i++) { 
    Console.WriteLine("Row {0} has {1} cans.", i, --cans/machine.Rows.Count); 
} 
Verwandte Themen