我正在生成三个整数序列,我将其存储在名为Triangle
,Pentagon
,Hexagon
的哈希集中。序列本身基于一个简单的算术公式,并且单调递增。
我没有在第三个词之后分析得到的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;
}
上面的代码显示了一些非常奇怪的算术行为:
n
切换到500,000到1,000,000之间会更改Triangle
hashset中的第3个术语。为什么会发生这种情况是序列单调递增? Triangle
中的第三项更大(值4128501),当n = 500,000时,第三项更小。Triangle
包含4128501,即使此值不可能位于Pentagon
hashset中。在Pentagon.Add
方法中捕获值4128501,我们看到它发生在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
对这个非常奇怪的问题有任何帮助表示感谢。
答案 0 :(得分:2)
你的HashSet
存储多头,但是你在循环体中使用int进行计算,并且你很快就开始产生溢出。
将for块中的i
从int
更改为long
,此方法返回1533776805,n = 500,000,n = 1,000,000。