예제 #1
0
        public void Problem21()
        {
            Func <int, dynamic> getDivisorsInfo = n =>
            {
                var uniqueDivisors = Sequences.UniqueDivisors(n).ToList();
                return(new
                {
                    Number = n,
                    AmicableSum = uniqueDivisors.Sum() - n
                });
            };

            var divisors_cache = Enumerable.Range(1, 9_999)
                                 .Select(getDivisorsInfo)
                                 .ToList();

            var d_cache = divisors_cache
                          .ToDictionary(x => x.Number, x => x.AmicableSum);

            Func <int, int> d = (n) =>
            {
                if (d_cache.ContainsKey(n))
                {
                    return(d_cache[n]);
                }
                else
                {
                    var divisorsInfo = getDivisorsInfo(n);

                    divisors_cache.Add(divisorsInfo);
                    d_cache.Add(divisorsInfo.Number, divisorsInfo.AmicableSum);

                    return(divisorsInfo.AmicableSum);
                }
            };

            var amicableNumbersUnder10000 = Enumerable.Range(1, 9_999)
                                            .Where(a =>
            {
                var b = d(a);
                return(a == d(b) && a != b);
            })
                                            .ToList();

            var answer
                = amicableNumbersUnder10000.Sum();


            Assert.That(answer, Is.EqualTo(31_626));
        }
예제 #2
0
        public void Problem23()
        {
            var abundantNumbers = new SortedSet <int>();

            for (int n = 12; n <= 28_123; n++)
            {
                var uniqueDivisors = Sequences.UniqueDivisors(n);
                var sum            = uniqueDivisors.Sum() - n;

                if (sum > n)
                {
                    abundantNumbers.Add(n);
                }
            }

            var numbersThatAreNotSumOfTwoAbundantNumbers = new SortedSet <int>(
                Enumerable.Range(1, 28_123)
                .Select(x => x)
                .ToList()
                );

            var abundantNumberList = abundantNumbers.ToList();

            for (int i = 0; i < abundantNumberList.Count; i++)
            {
                var iNum = abundantNumberList[i];
                for (int j = i; j < abundantNumberList.Count; j++)
                {
                    var jNum = abundantNumberList[j];

                    var sum = iNum + jNum;

                    if (numbersThatAreNotSumOfTwoAbundantNumbers.Contains(sum))
                    {
                        numbersThatAreNotSumOfTwoAbundantNumbers.Remove(sum);
                    }
                }
            }

            Assert.That(numbersThatAreNotSumOfTwoAbundantNumbers.Sum(), Is.EqualTo(4_179_871));
        }