-1

我有下面的代码。我创建了一个包含一百万和一个成员的列表(也尝试使用数组)。默认情况下,它们都具有值 0。它应该像多维数组一样工作,但没有必要,因为第一个“列”必须是 1-1.000.000 之间的数字。为了让生活更轻松,我创建了 1.000.001 个成员以避免使用第 0 位。在某个时刻,我必须使用这个列表的一个成员,该成员由一个变量寻址:list[n],并且为了避免问题,这只发生在 n < 1.000.000 时。由于有 0-1.000.000 的成员,我认为没关系,但我的程序在一段时间后仍然崩溃,错误代码为 ArgumentOutOfRangeException。我在这里想念什么?

            int highestCount = 0;
            int highestNum = 0;
            List<int> list = new List<int>();
            for(int j = 0; j <= 1000001; j++)
            {
                list.Add(0);
            }
            for (int i = 2; i < 1000000; i++)
            {
                int count = 0;
                int number = i;
                do
                {
                    if (i % 2 == 0)
                    {
                        number = number / 2;
                        if (number < 1000000)
                        {
                            if (list[number] != 0)
                            {
                                count += list[number];
                                break;
                            }
                            else
                            {
                                count++;
                            }
                        }
                        else { count++; };
                    }
                    else
                    {
                        number = (number * 3) + 1;
                        if (number < 1000000)
                        {
                            if (list[number] != 0) //program dies here
                                {
                                    count += list[number];
                                    break;
                                }
                            else
                            {
                             count++;
                            }
                        }
                        else { count++; };

                    }
                } while (number > 1);
                list[i] = count;
                if (count > highestCount)
                {
                    highestCount = count;
                    highestNum = i;
                }

            }
            MessageBox.Show(highestNum.ToString());
4

1 回答 1

2

我觉得只是你的逻辑有问题。

当 i == 3(第二次运行)时,它将进入 do-while 块。由于此时 i % 2 != 0 ,它会击中 else 。数字乘以 3 再加上 1。它小于 1000000,但是....

if(list[number] != 0)

永远不会评估为真,并且您陷入无限的do-while循环并且它永远不会爆发,因为A)数字将始终大于1(满足while条件);和 B)您在此循环上方的代码中将数组的每个元素设置为零(因此永远不会满足上述 if 条件):

for(int j = 0; j <= 1000001; j++)
{
    list.Add(0);
}
于 2013-08-23T13:56:12.843 回答