我正在处理一种数学函数,需要检查两个列表中哪一个更大且不能再被超越。我已经花了相当长的时间在这上面,但我无法得到正确的结果,代码变得对我来说越来越复杂。我认为可能有某种公式可以使我的生活更轻松,但我找不到它,我害怕数学不是我的强项。
这是我想做的:
我有两个列表,每隔一步都会添加值0或1。因此,第1步将0或1添加到List1,第2步将0或1添加到List2。
在进行6步后,该函数必须停止并检查List1内是否有更多的1还是List2内是否有更多的1,或者它们相等。
但是,例如,在第4步时,如果List1内有两个1,而List2内有两个0,则函数应该停止并显示List1,因为List2永远无法超过或等于List1。
另一个例子: 如果在第5步中,List1有1个1和2个0,而List2有2个1,则该函数应该停止,因为这已经不重要了,因为List2比List1有更多的1。
但我似乎无法解决这个谜题。有没有人能够解决这个问题?
这是我想做的:
我有两个列表,每隔一步都会添加值0或1。因此,第1步将0或1添加到List1,第2步将0或1添加到List2。
在进行6步后,该函数必须停止并检查List1内是否有更多的1还是List2内是否有更多的1,或者它们相等。
但是,例如,在第4步时,如果List1内有两个1,而List2内有两个0,则函数应该停止并显示List1,因为List2永远无法超过或等于List1。
另一个例子: 如果在第5步中,List1有1个1和2个0,而List2有2个1,则该函数应该停止,因为这已经不重要了,因为List2比List1有更多的1。
但我似乎无法解决这个谜题。有没有人能够解决这个问题?
private void button1_Click(object sender, EventArgs e)
{
resetLists();
}
private void button2_Click(object sender, EventArgs e)
{
nextStep();
}
public Random rnd = new Random();
public List<int> List1 = new List<int>();
public List<int> List2 = new List<int>();
public int step = 0;
private void resetLists()
{
List1.Clear();
List2.Clear();
step = 0;
Console.WriteLine("----------------------------");
}
private void nextStep()
{
step++;
if (step <= 6)
{
if (step % 2 != 0)
{
int result = rnd.Next(0, 2);
List1.Add(result);
Console.WriteLine("List 1: " + result.ToString());
}
else
{
int result = rnd.Next(0, 2);
List2.Add(result);
Console.WriteLine("List 2: " + result.ToString());
}
if (step > 3)
{
checkLists();
}
}
}
private void checkLists()
{
int actualResultList1 = 0;
int actualResultList2 = 0;
int virtualResultList1 = 0;
int virtualResultList2 = 0;
// GET THE ONES FROM LIST 1
for (int l1 = 0; l1 < List1.Count; l1++)
{
if (List1[l1] == 1)
{
actualResultList1++;
}
}
// GET THE ONES FROM LIST 2
for (int l2 = 0; l2 < List2.Count; l2++)
{
if (List2[l2] == 1)
{
actualResultList2++;
}
}
// CALCULUATE THE VIRTUAL ONES
virtualResultList1 = 3 - List1.Count;
virtualResultList2 = 3 - List2.Count;
if (step < 6)
{
if ((actualResultList1 + virtualResultList1) >= (actualResultList2 + virtualResultList2) + (6-step))
{
MessageBox.Show("List1");
}
if ((actualResultList2 + virtualResultList2) >= (actualResultList1 + virtualResultList1) + (6-step))
{
MessageBox.Show("List2");
}
}
else
{
if (actualResultList1 > actualResultList2)
{
MessageBox.Show("List1");
}
else if (actualResultList2 > actualResultList1)
{
MessageBox.Show("List2");
}
else if (actualResultList1 == actualResultList2)
{
MessageBox.Show("equal");
}
}
}
1
或0
来计算1
,因此您可以简单地使用List1.Sum()
来计算。关于提前停止的问题涉及到“x个中最好”与“前x个”的区别。如果您运行6步,则有一个“6个中最好”的情况。要将“n个中最好”转换为“前n个”,可以运行:(n + 1)/2
。并比较它是否大于或等于。如果您有6个步骤,则可以在任一列表的计数为> =(6 + 1)/ 2
时停止(在这种情况下为3.5,因此4符合此条件)。 - RobMath.Abs(List1.Count() - List2.Count()) > (numSteps - currentStep)
将告诉您是否有任何一个列表已经获胜。但是,您关于“for循环步骤”的示例不起作用 - List1 可以获得两个 1,List2 可以获得两个 0,并且它们都将在第6步结束时达到2。 - Rob