-1

私は Project Euler (質問 #8) に取り組んでいます。

1000 桁の数の連続する 5 桁の最大の積を見つけます。

73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 12540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113 62229893423380308135336276614282806444486645238749 30358907296290491560440772390713810515859307960866 70172427121883998797908792274921901699720888093776 65727333001053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 83972241375657056057490261407972968652414535100474 82166370484403199890008895243450658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 2421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450

連続した数字を見つけるための比較的単純なプログラムを作成しました。プログラムは、各数値を要素として含む文字配列の各桁をループ処理します。for ループ内で、現在位置の後の次の 4 つの数値を比較して、連続した数字であることを確認しました。私の理解では、数字 8527 は、7 が数字 8 の前にあるため、基準を満たします。

static void Main(string[] args)
    {
        string number = "731671...52963450";

        char[] numCharArray = number.ToCharArray();

        for (int i = 0; i < numCharArray.Length - 5; i++)
        {
            string n1Str = numCharArray[i + 1].ToString();
            string n2Str = numCharArray[i + 2].ToString();
            string n3Str = numCharArray[i + 3].ToString();
            string n4Str = numCharArray[i + 4].ToString();
            string iStr = numCharArray[i].ToString();

            int n1 = Convert.ToInt32(n1Str);
            int n2 = Convert.ToInt32(n2Str);
            int n3 = Convert.ToInt32(n3Str);
            int n4 = Convert.ToInt32(n4Str);
            int iNum = Convert.ToInt32(iStr);

            int prod = iNum * n1 * n2 * n3 * n4 ;

            //I believe this is the source of the problem
            if (iNum == n1 + 1 || iNum == n2 + 1 || iNum == n3 + 1 || iNum == n4 + 1 || iNum == n1 - 1 || iNum == n2 - 1 || iNum == n3 - 1 || iNum == n4 - 1)
            {
                Console.WriteLine(prod);
            }

        }

とにかく、私のためにこれに対する新しいアプローチを書かないでください。正しい答えが得られない理由を知りたいだけです。

ちなみに、プログラムには があり、IndexOutOfRangeExceptionすべての「答え」が得られますが、プログラムが正しく動作するようにロジックを実装したら、これを修正します。

4

3 に答える 3

3

このコードで何をしようとしているのかはわかりませんが、これが正しい答えを吐き出すとしたら、本当に驚かれることでしょう。

if (iNum == n1 + 1 || iNum == n2 + 1 || iNum == n3 + 1 || iNum == n4 + 1 || iNum == n1 - 1 || iNum == n2 - 1 || iNum == n3 - 1 || iNum == n4 - 1)
{
    Console.WriteLine(prod);
}

これを新しいアプローチと考えないでいただきたいと思いますが、私が提案したいのは次のとおりです。

static void Main(string[] args)
{
    string number = "731671...52963450";

    char[] numCharArray = number.ToCharArray();
    int maxProduct = 0; // initial value

    for (int i = 0; i < numCharArray.Length - 5 /* Fix IndexOutOfRange (see Matthew Fahrbach's answer) */; i++)
    {
        // ...

        int prod = iNum * n1 * n2 * n3 * n4;
        if (prod > maxProd)
        {
            maxProd = prod;
        }
    }

    Console.WriteLine(maxProd);
}
于 2013-03-16T17:43:50.733 に答える
3

for ループは配列の最後のインデックスに到達しますが、最後のインデックスの後に 4 つの要素にインデックスを付けています。これが IndexOutOfRangeException の理由です。代わりに次のことを試してください。

 for (int i = 0; i < numCharArray.Length - 5; i++)
于 2013-03-16T17:39:34.007 に答える
1

その問題を解決したので、この文脈で「連続した数字」が何を意味するのか誤解しているようです。ここでの連続とは「連続」を意味することを思い出します。したがって、5桁の各セット、73167、次に31671などを検討してください。このような5桁のセットは約996個あるはずです。それらのすべてのセットからそれらの数字の最大の積を見つけます。

于 2013-03-16T20:32:33.740 に答える