Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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();
        }