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;
}
上記のコードは、いくつかの非常に奇妙な算術動作を示しています。
- 入力
n
を 500,000 と 1,000,000 の間でTriangle
切り替えると、交差メソッドの後のハッシュセットの 3 番目の項が変更されます。シーケンスが単調に増加しているのに、なぜこれが発生するのですか? - 奇妙なことに、第 3 項は
Triangle
、n = 1,000,000 の場合は大きく (値 4128501)、n = 500,000 の場合は小さくなります。 - 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
この非常に奇妙な問題について何か助けていただければ幸いです。