Challenge: Non-abundant sums

Posted on: October 19, 2016 12:57:48 AM
This challenge wants you to find the sum of all the positive integers which cannot be written as the sum of two abundant numbers. An abundant number is described as the sum of the proper divisors are greater than the original number. For example, 12 is the smallest abundant number with it's divisors 1, 2, 3, 4, 6 summed together being 16. Where 12 is the smallest abundant number, 24 is would be the smallest abundant sum.
Program.cs
using Common.Math;
using System;
using System.Collections.Generic;
using System.Linq;

namespace ProjectEuler_23
{
    internal class Program
    {
        private const int HighestNumNotAbundantSum = 28123;

        private static bool IsAbundant(int i)
        {
            int[] factors = i.GetFactors().Distinct().ToArray();
            int sum = factors.Sum() - i;

            return sum > i;
        }

        private static void Main(string[] args)
        {
            int sum = 0;
            bool[] isAbundantSum = new bool[HighestNumNotAbundantSum + 1];
            List abundantNumbers = new List();

            //12 is the lowest abundant number
            for (int i = 12; i < HighestNumNotAbundantSum - 12; i++)
            {
                if (IsAbundant(i))
                {
                    abundantNumbers.Add(i);

                    for (int x = 0; x < abundantNumbers.Count; x++)
                    {
                        int abundantSum = i + abundantNumbers[x];

                        if (abundantSum <= HighestNumNotAbundantSum)
                        {
                            isAbundantSum[abundantSum] = true;
                        }
                    }
                }
            }

            for (int i = 1; i < isAbundantSum.Length; i++)
            {
                if (!isAbundantSum[i])
                {
                    sum += i;
                }
            }

            Console.WriteLine($"Sum of all numbers than can't be the sum of two abundant numbers: {sum}");
        }
    }
}
MathExtensions.cs
using System.Collections.Generic;
using System.Linq;

namespace Common.Math
{
    public static class MathExtensions
    {
        public static int[] GetFactors(this int num)
        {
            List factors = new List { 1, num };
            int root = (int)System.Math.Sqrt(num);

            for (int i = 2; i <= root; i++)
            {
                if (num % i == 0)
                {
                    factors.Add(i);
                    factors.Add(num / i);
                }
            }

            return factors.OrderBy(x => x).ToArray();
        }
    }
}
This code is pretty straight forward, first we loop starting at 12 since it's the lowest known abundant number up to the highest non-abundant number known subtract 12. Then we determine if the number is abundant and store it. To use as few loops as possible, we then calculate out all the possible sums and store those values into a BitArray. Last, we loop through the BitArray and sum all the false values to get the answer.
As a note: I've moved the generating of factors code into a common library that I'm going to start referencing in projects that require it because it is a pretty common math function needed for these. This will likely be the last time I post the code for it, if you're following my posts, you should have this function working for your future projects as well.

Comments


[url=http://medxx.eu/]http://medxx.eu/[/url] extepojete

DavidDap November 19, 2019 2:30:57 PM

Удалено (перепутал топик) --- Вы ошибаетесь. Пишите мне в PM, обсудим. скачать fifa, скачать фифа а также [url=http://15fifa.ru/]15fifa.ru[/url] скачать фифа

StacySaw November 21, 2019 3:30:07 AM

[url=http://ciphony.eu/]http://ciphony.eu/[/url] extepojete

RogerHoumn November 21, 2019 5:31:03 AM

Приветствую вас Знакомые покупали Препараты для лечения [url=http://anticancer24.ru/shop/267/desc/bdenza]BDEnza (Энзалутамид) – Аналог Кстанди (XTANDI)[/url]

Mariainite November 21, 2019 7:17:45 PM

[url=https://axajecynusip.tk]Contest[/url] videos

AlbertBiz November 23, 2019 1:08:39 PM

[url=http://eolp.eu/]http://eolp.eu/[/url] extepojete

Williamcof November 26, 2019 5:36:30 AM

[url=http://lomazy.eu/]http://lomazy.eu/[/url] extepojete

Haroldidola November 27, 2019 4:33:09 AM

[url=http://sonz.eu/]http://sonz.eu/[/url] extepojete

CarlosChavy November 27, 2019 9:39:51 PM

UKP-66 «Metakom – работает, но очень плохо», думаю вам не стоит брать

Dariocow November 29, 2019 11:20:55 AM

[url=https://anticancer24.ru/shop/139/desc/lucisun50]LuciSun - дженерик Сутент (Sutent) - Sunitinib (Сунитиниб)[/url] – это противоопухолевый препарат, который был произведен на основе сунитиниба. Препарат назначают людям с онкологическими заболеваниями, при опухолевом процессе с метастатическими поражениями. Основное действие препарата заключается в том, что активное действующее вещество блокирует тирокиназы – именно эти рецепторы отвечают за поддержание роста опухоли. Благодаря препарату можно подавлять рост опухоли, а процесс распространения метастаз постепенно тормозится. [url=https://anticancer24.ru/shop/139/desc/lucisun50]LuciSun - дженерик Сутент (Sutent ) - Sunitinib (Сунитиниб) купить[/url] можно на этом сайте – мы предлагаем качественную продукцию по адекватным ценам. Опытные специалисты расскажут всю информацию о производителе, при необходимости предъявят сертификаты качества и предоставят прочую актуальную информацию для потенциального покупателя. Как принимать? Принимать таблетки нужно орально, при этом пить их можно, не связывая с приемом пищи. Важно соблюдать одно условие: пить капсулы нужно в одно и то время – чтобы в крови поддерживать оптимальный уровень основного действующего вещества. На [url=https://anticancer24.ru/shop/139/desc/lucisun50]LuciSun - аналог Сутент (Sutent) - Sunitinib (Сунитиниб) цена[/url] колеблется, и этот фактор напрямую зависит от формы выпуска препарата. У нас стоимость лекарства адекватная, одна из самых низких – и это связано с тем, что мы работаем напрямую с производителем. Что касается дозировки, то для каждого пациента она индивидуальная. Как правило, доза зависит от общего самочувствия, сложности заболевания и его запущенности, сопутствующих недугов. Все эти факторы учитывает врач-онколог при назначении препарата. Стандартная дозировка подразумевает ежедневное применение пациентом 50 мг лекарства. Что касается курса – 4 недели человек должен пить таблетки, спустя 2 недели нужно сделать перерыв. При необходимости терапию возобновляют вновь. Про [url=https://anticancer24.ru/shop/139/desc/lucisun50]LuciSun - аналог Сутент (Sutent) - Sunitinib (Сунитиниб) отзывы[/url] положительные. Пациенты, проходившие лечение с применением этого средства, утверждают, что при корректно подобранной дозировке побочные эффекты отсутствуют, лекарство переносится хорошо, а терапия дает положительные результаты. Онкология – не приговор! Благодаря тому, что наука уверенно идет вперед, ученым удается с каждым годом создавать все новые и новые препараты, благодаря которым можно приостановить рост опухоли. На [url=https://anticancer24.ru/shop/139/desc/lucisun50]LuciSun - дженерик Сутент (Sutent) - Sunitinib (Сунитиниб) стоимость[/url] – высокая, но лекарство того стоит. Оно является эффективным, препарат прошел множество клинических испытаний, и все они подтверждают – средство является действительно эффективным. Причем если проводить химио- либо лучевую терапию – в некоторых случаях она является неэффективной. Мало того, облучение крайне негативно действует на все органы и системы организма. У таблеток, конечно, имеются негативные побочные эффекты, но проявляют себя они крайне редко, и никак не сравнятся с побочками, которые возникают после проведения химиотерапии. [url=https://anticancer24.ru/shop/139/desc/lucisun50]сунитиниб цена купить[/url]

Laratravy December 1, 2019 11:42:40 AM

i am from Italy hello. Can you help me translate? /rardor

rardtothe December 2, 2019 5:22:39 PM

Remember me [url=https://yvihulutyfuc.tk]Customer[/url] service video

Zacharyemurb December 5, 2019 12:21:00 PM

Leave a Comment