0

我正在生成三个整数序列,它们存储在名为Triangle, Pentagon,的哈希集中Hexagon。序列本身基于一个简单的算术公式并且是单调递增的。

在第三项之后,我还没有分析得到的哈希集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在交集方法之后更改哈希集中的第三项。为什么会发生这种情况是序列单调递增?
  2. 奇怪的是,当 n = 1,000,000 时,in 的第三项Triangle更大(值 4128501),而当 n = 500,000 时,in 的第三项更大(值 4128501)。
  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商店很长,但是您在循环体中使用整数进行计算,并且您开始很快产生溢出。

i将for 块从更改intlong,此方法在 n = 500,000 和 n = 1,000,000 时返回 1533776805。

于 2013-03-10T19:04:11.873 回答