0

Triangle、、Pentagonと呼ばれるハッシュセットに格納する 3 つの整数シーケンスを生成していHexagonます。シーケンス自体は単純な算術式に基づいており、単調増加しています。

3 番目以降のハッシュセットは分析していませんTriangle。そこから問題が発生するからです。

    public static long TriPentHex(int n)
    {

        HashSet<long> Triangle = new HashSet<long>();
        List<long> TriList = new List<long>();
        long temp = 0;
        for (int i = 1; i <= n; i++)
        {
            temp = (i * (i + 1)) / 2;
            Triangle.Add(temp);
            TriList.Add(temp);
        }
        HashSet<long> Pentagon = new HashSet<long>();
        for (int i = 1; i <= n; i++)
        {
            temp = i * (3 * i - 1) / 2;
            if (temp == 4128501)
                Debug.WriteLine(temp);
            Pentagon.Add(temp);
        }
        HashSet<long> Hexagon = new HashSet<long>();
        for (int i = 1; i <= n; i++)
            Hexagon.Add(i * (2 * i - 1));

        Triangle.IntersectWith(Pentagon);
        Triangle.IntersectWith(Hexagon);
        List<long> TriList2 = Triangle.ToList();
        temp = TriList2[2];     // excluding 1 and 40755
        return TriList.IndexOf(temp) + 1;

    }

上記のコードは、いくつかの非常に奇妙な算術動作を示しています。

  1. 入力nを 500,000 と 1,000,000 の間でTriangle切り替えると、交差メソッドの後のハッシュセットの 3 番目の項が変更されます。シーケンスが単調に増加しているのに、なぜこれが発生するのですか?
  2. 奇妙なことに、第 3 項はTriangle、n = 1,000,000 の場合は大きく (値 4128501)、n = 500,000 の場合は小さくなります。
  3. n = 1,000,000 にとどまると、結果のハッシュセットTriangleには 4128501 が含まれますが、この値はハッシュセットに含まれていない可能性がありますPentagon
  4. メソッドで値 4128501 をトラップするPentagon.Addと、i = 56751 で発生することがわかります。ただし、加算する値が i*(3*i-1)/2 の場合、結果の数値が4128501. ただし、以下はイミディエイト ウィンドウの直接出力です。

    ?i
    567561
    ?i * (3*i-1)
    8257002
    ?i * (3*i-1)/2
    4128501
    
  5. 最後に、n = 1,000,000 を使用していずれかを呼び出そうとすると、Pentagon.Max()次のメッセージが表示されます。Triangle.Max()Hexagon.Max()

     Hexagon.Max()  This expression causes side effects and will not be evaluate    long
    

この非常に奇妙な問題について何か助けていただければ幸いです。

4

1 に答える 1

2

ストアHashSetは長くなりますが、計算のためにループ本体で int を使用しているため、オーバーフローがすぐに発生し始めます。

ifor ブロックを からintに変更するとlong、このメソッドは n = 500,000 および n = 1,000,000 に対して 1533776805 を返します。

于 2013-03-10T19:04:11.873 に答える