C#中的循环赛

时间:2009-08-08 23:54:37

标签: c# logic

我遇到了问题(可能是由于睡眠不足!)我正在尝试用C#解决数学问题。

假设我有一台饮料机,我有三排可以装满可乐的空行。我手里拿着17罐可乐,我必须每次填充一行。

例如......

通过1:

  

将可乐添加到第1行。饮料= 1   将可乐添加到第2行。饮料= 1   将可乐添加到第3行。饮料= 1

通过2:

  

将可乐添加到第1行。饮料= 2
  将可乐添加到第2行。饮料= 2
  将可乐添加到第3行。饮料= 2

...

通过6

  

将可乐添加到第1行。饮料= 6
  将可乐添加到第2行。饮料= 6
  将可乐添加到第3行。饮料= 5(此时不再有饮料)

出于某种原因,我完全迷失了。有人可以帮忙吗?!

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:2)

您可以计算每行添加的罐数,而不是循环添加一个罐头:

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

答案 2 :(得分:1)

从臀部拍摄:

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玩真的松散]。