Example #1
0
        public void Solve()
        {
            var maxChain = new List <long>();

            for (int i = 2; i <= max; i++)
            {
                long number = i;
                var  chain  = new List <long>();

                while (number > 0 && number < max)
                {
                    if (tried.Contains(number))
                    {
                        break;
                    }
                    var location = chain.IndexOf(number);

                    if (location >= 0)
                    {
                        if ((chain.Count - location) > maxChain.Count)
                        {
                            chain.RemoveRange(0, location);
                            maxChain = chain;
                        }
                        break;
                    }
                    else
                    {
                        chain.Add(number);
                    }
                    number = Standard.Sum(prm.Divisors(number, true));
                }
                foreach (var val in chain)
                {
                    tried.Add(val);
                }
            }

            //Console.WriteLine($"Final maximum chain length {maxChain.Count}");
            long min = Int64.MaxValue;

            foreach (var val in maxChain)
            {
                if (val < min)
                {
                    min = val;
                }
            }
            Console.WriteLine(min);
        }