У меня проблема (возможно, из-за недостатка сна!), где я пытаюсь решить проблему математики на С#.
Скажем, у меня есть машина для напитков, и у меня есть три пустых строки, которые могут быть заполнены Cola. У меня есть 17 банок Колы в руке, и я должен заполнять каждую строку по очереди.
Например...
Пасс 1:
Добавить Cola в строку 1. Drinks = 1
Добавить Cola в строку 2. Drinks = 1
Добавить Cola в строку 3. Drinks = 1
Pass 2:
Добавить Cola в строку 1. Напитки = 2
Добавить Cola в строку 2. Напитки = 2
Добавить Cola в строку 3. Drinks = 2
...
Пасс 6
Добавить Cola в строку 1. Напитки = 6
Добавить Cola в строку 2. Напитки = 6
Добавить Cola to Row 3. Напитки = 5 (в этот момент больше не осталось напитков)
По какой-то причине я полностью потерялся. Может ли кто-нибудь помочь?!
Довольно быстрый и безболезненный, и требуется только один цикл, а не два вложенных цикла. Все, что вам нужно, это немного математики, чтобы получить правильный индекс массива:
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.");
Это производит это как вывод:
Row 1 has 6 cans.
Row 2 has 6 cans.
Row 3 has 5 cans.
Вместо того, чтобы зацикливать, чтобы добавить банку за раз, вы можете рассчитать, сколько банок будет получать каждая строка:
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);
}
Съемка с бедра:
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]++;
}
количество напитков в каждой строке находится в drinksInRow
, индексируется по номеру строки, начиная с 0.
Это быстрее, чем повторные проходы; в основном его O (NUM_ROWS) [при воспроизведении действительно свободно с Big-O].