列表/数组成员可以';无法寻址——Euler 14

本文关键字:寻址 Euler 数组 组成员 列表 | 更新日期: 2023-09-27 18:28:43

我有下面的代码。我创建了一个包含一百万和一个成员的列表(也尝试过使用数组)。默认情况下,所有这些都具有值0。它应该像多维数组一样工作,但没有必要,因为第一个"列"必须是1-1.000000之间的数字。为了让生活更轻松,我让1.000.0001名成员避免使用第0位。在某一点上,我必须使用由变量list[n]寻址的该列表的成员,并且为了避免问题,只有当n<1.000.000。由于有0-1.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());

列表/数组成员可以';无法寻址——Euler 14

我认为这只是您的逻辑有问题。

当i==3(在第二次运行时),它将进入do-while块。自i%2!=0时,它将击中其他。这个数字乘以3,再加上1。不到1000000,但是。。。。

if(list[number] != 0)

永远不会计算为true,并且您被困在一个无限的do-while循环中,它永远不会爆发,因为A)数将始终大于1(满足while条件);和B)在这个循环上面的代码中,你将数组的每个元素都设置为零(因此永远不会满足上面的if条件):

for(int j = 0; j <= 1000001; j++)
{
    list.Add(0);
}