从我的项目中计算外部文件中的数字(Project Euler#13)

时间:2012-09-02 18:16:25

标签: c# algorithm

我正在尝试找到解决Project Euler problem #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数组的集合中,但该集合需要具有多种功能并存储任何行/列。除了基本列表之外,有关如何存储这些数字的任何想法吗?有没有一种方法可以设置一个列表,所以它就像一个未预定义的2D数组?提前谢谢!

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

2 个答案:

答案 0 :(得分:1)

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

如果由于某种原因你想要解决一个更普遍的问题,你可能确实使用列表列表,列表&gt;。

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

答案 1 :(得分: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数组,但在您的情况下它足够好。