C# Collatz序列-减少错误

C# Collatz序列-减少错误,c#,C#,为正整数集定义以下迭代序列: n→ n/2(n为偶数) n→ 3n+1(n为奇数) 使用上述规则并从13开始,我们生成以下序列: 十三,→ 40→ 20→ 10→ 5.→ 16→ 8.→ 4.→ 2.→ 一, 可以看出,该序列(从13开始到1结束)包含 10个条款。虽然还没有被证明(科拉兹问题),但人们认为所有的起始数字都以1结束 哪一个起始数字,在一百万以下,产生的链条最长 这是我解决眼前问题的办法 static void Main(string[] args) { int possC

为正整数集定义以下迭代序列:

n→ n/2(n为偶数)

n→ 3n+1(n为奇数)

使用上述规则并从13开始,我们生成以下序列:

十三,→ 40→ 20→ 10→ 5.→ 16→ 8.→ 4.→ 2.→ 一,

可以看出,该序列(从13开始到1结束)包含 10个条款。虽然还没有被证明(科拉兹问题),但人们认为所有的起始数字都以1结束

哪一个起始数字,在一百万以下,产生的链条最长

这是我解决眼前问题的办法

static void Main(string[] args)
{
    int possCounter = 0;
    int largestChain = 0;
    int largestChainNum = 0;
    int chainNum = 0;
    for (int i = 2; i <= 999999; i++)
    {
        chainNum = i;
        possCounter = 1;
        while (chainNum != 1)
        {
            if (chainNum % 2 == 0)
            {
                chainNum = chainNum / 2;
            }
            else
            {
                chainNum = (3 * chainNum) + 1;
            }
            possCounter++;
            Console.WriteLine(chainNum);
        }
        if (possCounter > largestChain)
        {
            largestChainNum = i;
            largestChain = possCounter;
        }
    }
    Console.WriteLine(largestChainNum);
    Console.ReadLine();
}
static void Main(字符串[]args)
{
int posscouter=0;
int最大链=0;
int largestChainNum=0;
int chainNum=0;
对于(int i=2;i最大链)
{
最大链数=i;
最大链=最大计数器;
}
}
Console.WriteLine(最大链数);
Console.ReadLine();
}

我将
控制台.WriteLine(chainNum)
放在
possconter++
之后,只是为了检查我的代码是否正确运行。但是,它会正确运行,在某一点上,它开始运行负数。我不确定我的代码哪里出错了。

这是一个整数溢出。如果您使用较大的类型(如Long),它应该可以正常工作。

在解决问题(跟踪序列)时,您将遇到数字

56991483520
它大于
int.MaxValue
,因此您将有一个溢出;我建议对序列成员使用
long
。还有一个优化技巧是通过一系列序列项进行更新:跟踪

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
您知道
40
20
16
的长度,无需再次计算这些数字

private static Dictionary<long, int> s_Counts = new Dictionary<long, int>() {
  {1, 1},
};

private static void AppendCounts(long n) {
  List<long> list = new List<long>();

  for (; !s_Counts.ContainsKey(n); n = n % 2 == 0 ? n / 2 : 3 * n + 1) 
    list.Add(n);

  int count = s_Counts[n];

  for (int i = list.Count - 1; i >= 0; --i)
    s_Counts.Add(list[i], count + list.Count - i);
}

...

for (int i = 1; i < 1000000; ++i)
  AppendCounts(i);

KeyValuePair<long, int> max = new KeyValuePair<long, int>(0, 0);

foreach (var pair in s_Counts)
  if (pair.Value > max.Value)
    max = pair;

Console("{0} generates {1} values", max.Key, max.Value); 

工作得很好。非常感谢。
837799 generates 525 values