1

プロジェクトオイラーの問題#13を解決するための複数の方法を見つけようとしています。私はすでに2つの異なる方法で解決しましたが、今回私がやろうとしているのは、すべての数値を含むテキストファイルからソリューションを読み取らせ、そこから変換して、最も遠い列番号を追加することです。右。また、リストに新しい数値を追加する場合、リストに任意の数の行または列を含めることができるようにこの問題を解決したいので、その長さは事前定義されていません(非配列?ジャグ配列は事前定義できないため、ここでは適切に適用されます)。

これまでのところ私は持っています:

    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リストに格納して、そこからすべての整数を合計するのは少し簡単すぎるでしょう。

4

2 に答える 2

1

この場合、実際にはその寸法が100 x 50であることが事前にわかっているため、2D配列を使用するだけで済みます。

何らかの理由でより一般的な問題を解決したい場合は、実際にリストのリスト、リスト>を使用できます。

そうは言っても、私は疑問に思います:あなたは実際にすべての数字を合計しようとしていますか?もしそうなら、私は別のアプローチを提案します:50桁の数字のどのセクション部分が実際にそれらの合計の最初の桁に影響を与えるかを考えてください。ヒント:数字全体は必要ありません。

于 2012-09-02T18:45:22.307 に答える
1

.NETFrameworkに組み込まれているサイズ変更可能な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 に答える