protected override void Solve(out string answer) { var testedRange = Enumerable.Range(1, 28123).AsParallel(); long summator = 0; //Parallel.ForEach() testedRange.ForAll(number => { NumberDivisor numberDivisor = new NumberDivisor(); bool hasBeenWrittenAsSumOfTwoAbundantNumbers = false; //Will be set to true only if at least one sum can be expressed using abundant numbers. long midpoint = (number / 2) + 1; for (int i = 1; i <= midpoint; i++) { #region Get left and right portions of the number in all combinations var left = i; var right = number - left; #endregion var leftAbundancyType = numberDivisor.IsAbundantOrDeficientOrPerfect(left); var rightAbundancyType = numberDivisor.IsAbundantOrDeficientOrPerfect(right); if (leftAbundancyType == AbundancyType.Abundant && rightAbundancyType == AbundancyType.Abundant) { hasBeenWrittenAsSumOfTwoAbundantNumbers = true; break; } } if (!hasBeenWrittenAsSumOfTwoAbundantNumbers) { lock (this) summator += number; //Increase the sum if combination of 2 abundant numbers could not be found. } }); answer = string.Format("Sum of all the positive integers which cannot be written as the sum of two abundant numbers is {0}.", summator); }
protected override void Solve(out string answer) { NumberDivisor numberDivisor = new NumberDivisor(); long n = 220; long f = numberDivisor.CalculateSumOfProperDivisors(n); Answer = f.ToString(); Dictionary <long, long> mapOfNumbersToDivisors = new Dictionary <long, long>(); // Identify the list of all d() functions under 10000. foreach (int number in Enumerable.Range(1, 10000)) { long dFunction = numberDivisor.CalculateSumOfProperDivisors(number); mapOfNumbersToDivisors.Add(number, dFunction); } //mapOfNumbersToDivisors.Add(220, d(220)); //mapOfNumbersToDivisors.Add(284, d(284)); List <long> amicableNumbers = new List <long>(); // Find the amicable numbers mapOfNumbersToDivisors.AsParallel().ForAll(mapEntry => { long key = mapEntry.Key; if (amicableNumbers.Contains(key)) { return; // Make sure we do not count the same amicable number twice. } long value = mapEntry.Value; try { long reverseKey = mapOfNumbersToDivisors[value]; if (key == reverseKey) //Key and value are the two amicable numbers. Add them to the list to remember. { if (key != value) //amicability requires that d(a) = b and d(b) = a, where a != b { amicableNumbers.Add(key); amicableNumbers.Add(value); } } } catch (KeyNotFoundException e) { //There is no reverse value in the collection, so no chance of amicability. string m = e.Message; } }); var sumOfAmicableNumbers = amicableNumbers.Sum(); answer = string.Format("The sum of all the amicable numbers under 10000 is {0}.", sumOfAmicableNumbers); }
public void TestPerfects() { DateTime start = DateTime.Now; long temp = 28; NumberDivisor numberDivisor = new NumberDivisor(); var sumDivisors = numberDivisor.CalculateSumOfProperDivisors(temp); var is28Abundant = numberDivisor.IsAbundantOrDeficientOrPerfect(temp); var is12Abundant = numberDivisor.IsAbundantOrDeficientOrPerfect(12); var is57Abundant = numberDivisor.IsAbundantOrDeficientOrPerfect(57); var elapsedTime = DateTime.Now - start; var sb = new StringBuilder(); sb.AppendFormat("Elapsed computation time: {0}. Sum of properDivisors of {1} = {2}.", elapsedTime, temp, sumDivisors); sb.AppendLine(); sb.AppendFormat("Number {0} is {1}.", temp, is28Abundant); sb.AppendLine(); sb.AppendFormat("Number {0} is {1}.", 12, is12Abundant); sb.AppendLine(); sb.AppendFormat("Number {0} is {1}.", 57, is57Abundant); sb.AppendLine(); Answer = sb.ToString(); }