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)); }
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)); }