使用Hashset <long> </long>的意外算术结果

时间:2013-03-10 18:50:26

标签: c#

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

我没有在第三个词之后分析得到的hashset 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 hashset中的第3个术语。为什么会发生这种情况是序列单调递增?
  2. 奇怪的是,当{n = 1,000,000时,Triangle中的第三项更大(值4128501),当n = 500,000时,第三项更小。
  3. 保持n = 1,000,000,生成的hashset Triangle包含4128501,即使此值不可能位于Pentagon hashset中。
  4. Pentagon.Add方法中捕获值4128501,我们看到它发生在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
    
  6. 对这个非常奇怪的问题有任何帮助表示感谢。

1 个答案:

答案 0 :(得分:2)

你的HashSet存储多头,但是你在循环体中使用int进行计算,并且你很快就开始产生溢出。

将for块中的iint更改为long,此方法返回1533776805,n = 500,000,n = 1,000,000。