确定每行的行数和数量

时间:2012-01-11 04:27:19

标签: c# c#-4.0

这不是一个复杂的问题,但我不能无论出于什么原因想到一个简单的方法来使用模数运算符。基本上我有N个项目的集合,我想在网格中显示它们。

我最多可以显示3个条目,垂直无限;它们不是固定的宽度......所以如果我有2个项目,它们会显示为[1][2]。如果我有4个项目,它们会显示如下:

[1][2]
[3][4]

如果我有5个项目,它应该是这样的:

[ 1 ][ 2]
[3][4][5]

七个项目稍微复杂一点:

[ 1 ][ 2]
[ 3 ][ 4]
[5][6][7]

这是其中一个问题,如果我睡在它上面,它会在早上脑死亡,但我能想到的只是复杂的循环和状态变量。必须有一个更简单的方法。

我在C#中这样做,但我怀疑语言是否重要。

4 个答案:

答案 0 :(得分:3)

通过最大化具有三个项目的行数,可以最小化总行数。因此,六个项目将被分组为两行3而不是3行2:

[1][2][3]
[4][5][6]

并且十个项目将被分组为两行2行和2行3行而不是5行2:

[ 1 ][ 2 ]
[ 3 ][ 4 ]
[5][6][7 ]
[8][9][10]

如果您想要先包含两个项目的行,那么您将继续剥离两个项目,直到其余项目可被3整除。当您完成循环时,您需要使用索引跟踪剩余项目的数量或诸如此类的东西。

在循环中填充每一行,您可以检查以下条件:

//logic within loop iteration
if (remaining % 3 == 0) //take remaining in threes; break the loop
else if (remaining >= 4) //take two items, leaving two or more remaining
else //take remaining items, which will be two or three; break the loop

如果我们看一下10个项目的例子,那么过程将如下:

  1. 剩余10件商品。 10%3!= 0。因为10> 4,拿两件物品。
  2. 剩余8件商品。 8%3!= 0。因为8> 4,拿两件物品。
  3. 剩余6件商品。 6%3 = 0.将这6个项目分成三组。
  4. 转到7个项目的示例:

    1. 剩余7件商品。 7%3!= 0。因为7> 4,拿两件物品。
    2. 剩余5件商品。 5%3!= 0.由于5> 4,拿两件物品。
    3. 剩余3件商品。 3%3 = 0.将这3项作为一组。
    4. 以下是4项的结果:

      1. 剩余4件物品。 4%3!= 0.由于剩余= 4,请选择两项。
      2. 剩余2件物品。 2%3!= 0.2 <2。 4.落入其他条件,取剩余物品。
      3. 我认为那会奏效。至少在凌晨12:30,它似乎应该有效。

答案 1 :(得分:2)

if ((list.Count % 2) == 0)
{
 //Display all as [][]
                  [][]
}
else
{
//Display all as    [][]
                    [][]
//Display last 3 as [][][]
}

答案 2 :(得分:1)

所以,鉴于:a)目标是最小化行数,b)行不能超过3个项目,c)如果可能,行应该有3个项目,d)你不能有一行除非它是唯一的项目,我会说算法如下:

  1. 如果只有一个项目,它将独自存在;完成。
  2. 通过将项目数除以3来计算“暂定”行数。
  3. 如果余数(N%3)为0,那么所有行将有3个项目。
  4. 如果余数为1,则会有一个额外的行,最后两行每个只有2个项目。
  5. 如果余数为2,则会有一个额外的行,并且只有2个项目。
  6. 此算法将产生与您想象的格式略有不同的格式(3项目行将位于顶部,2项目行将位于底部),但它满足约束条件。如果您需要将两项行放在顶部,则可以对其进行修改。

答案 3 :(得分:1)

伪代码怎么样

if n mod 3 = 1
  first 2 rows have 2 items each (assuming n >= 4)
  all remaining rows have 3 items

else if n mod 3 = 2
  first row has 2 items
  all remaining rows have 3 items

else
  all rows have 3 items