我正在生成三个整数序列,它们存储在名为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;
}
上面的代码显示了一些非常奇怪的算术行为:
n
在 500,000 和 1,000,000 之间切换输入会Triangle
在交集方法之后更改哈希集中的第三项。为什么会发生这种情况是序列单调递增?- 奇怪的是,当 n = 1,000,000 时,in 的第三项
Triangle
更大(值 4128501),而当 n = 500,000 时,in 的第三项更大(值 4128501)。 - 保持 n = 1,000,000,生成的哈希集
Triangle
包括 4128501,即使该值不可能在Pentagon
哈希集中。 在方法中捕获值 4128501
Pentagon.Add
,我们看到它发生在 i = 56751。但是,如果要添加的值是 i*(3*i-1)/2,则很明显结果数应该大于4128501。然而,下面是立即窗口的直接输出:?i 567561 ?i * (3*i-1) 8257002 ?i * (3*i-1)/2 4128501
最后,当我使用 n = 1,000,000 时,我尝试调用其中之一
Pentagon.Max()
,Triangle.Max()
或者Hexagon.Max()
我收到以下消息:Hexagon.Max() This expression causes side effects and will not be evaluate long
对于这个非常奇怪的问题,我们将不胜感激。