1

我正在尝试寻找多种方法来解决 Project Euler 的问题 #13。我已经用两种不同的方式解决了它,但是这次我要做的是让我的解决方案从包含所有数字的文本文件中读取,然后从那里对其进行转换并将最远的列号添加到正确的。我还想以某种方式解决这个问题,如果我们要向列表中添加新数字,列表可以包含任意数量的行或列,因此它的长度不是预定义的(非数组?我不确定是否锯齿状数组将在此处正确应用,因为它无法预定义)。

到目前为止,我有:

    static void Main(string[] args)
    {

        List<int> sum = new List<int>();

        string bigIntFile = @"C:\Users\Justin\Desktop\BigNumbers.txt";

        
        string result;
    
        StreamReader streamReader = new StreamReader(bigIntFile);

        while ((result = streamReader.ReadLine()) != null)
        {
            for (int i = 0; i < result.Length; i++)
            {
                int converted = Convert.ToInt32(result.Substring(i, 1));
                sum.Add(converted);
            }
        }

    }

它读取文件并将每个字符从字符串转换为单个 int。我试图思考如何将该 int 存储在一个类似于 2D 数组的集合中,但该集合需要是通用的并存储任何 # 行/列。除了基本列表之外,关于如何存储这些数字的任何想法?有没有办法可以设置一个列表,使它就像一个未预定义的二维数组?提前致谢!

更新:我也不想使用“BigInteger”。这有点太容易阅读该行,将字符串转换为 BigInt,将其存储在 BigInt 列表中,然后从那里总结所有整数。

4

2 回答 2

1

在这种情况下,您可以简单地使用 2D 数组,因为您实际上事先知道它的尺寸:100 x 50。

如果出于某种原因你想解决一个更普遍的问题,你可能确实会使用 List of Lists,List>。

话虽如此,我想知道:你真的想总结所有的数字吗?如果是这样,我会建议另一种方法:考虑 50 位数字的哪一部分实际上影响了它们总和的前几位。提示:您不需要完整的数字。

于 2012-09-02T18:45:22.307 回答
1

.NET 框架中没有内置可调整大小的 2D 集合。我只使用“锯齿状数组”类型的数据结构,仅使用列表:

List<List<int>>

您还可以通过为每一行使用一个数组来改变这种模式:

List<int[]>

如果你想更简单地阅读文件,这里是如何:

List<int[]> numbers =
 File.EnumerateLines(path)
 .Select(lineStr => lineStr.Select(@char => @char - '0').ToArray())
 .ToList();

少得多的代码。你可以重用很多内置的东西来做基本的数据转换。这使您编写和维护的代码更少。它更具可扩展性,并且不易出现错误。

如果要从此结构中选择一列,请执行以下操作:

int colIndex = ...;
int[] column = numbers.Select(row => row[index]).ToArray();

您可以将此行封装到一个辅助方法中,以从您的主要加法算法中去除噪声。

请注意,所有这些模式的效率低于 2D 数组,但在您的情况下它已经足够好了。

于 2012-09-02T18:45:44.677 回答