项目Euler#23 in C#

时间:2016-04-14 09:00:32

标签: c#

项目Euler challenge 23声明:

  

完美数字是一个数字,其正确除数的总和恰好等于数字。例如,28的适当除数之和为1 + 2 + 4 + 7 + 14 = 28,这意味着28是一个完美数。

     

如果n的适当除数之和小于n,则n被称为不足,如果该和超过n则称为n。

     

由于12是最小的有限数,1 + 2 + 3 + 4 + 6 = 16,可以写成两个有限数之和的最小数是24.通过数学分析,可以看出所有大于28123的整数可以写成两个数字的总和。然而,即使知道不能表示为两个丰富数字之和的最大数量小于该限制,也不能通过分析进一步降低该上限。

     

找出所有正整数的总和,这些正整数不能写为两个数字的总和。

所以我一直在尝试让这个工作正常,但是我一直收到不正确的结果,我不知道代码在哪里出错了,尽管我有:

    static void Main(string[] args)
    {
        List<int> abundantNums = Enumerable.Range(12, 1000000).Where(i => isAbundant(i)).ToList();
        abundantNums = abundantNums.Distinct().ToList();

        var boolArr = new bool[28124];        

        for (int i = 0; i < abundantNums.Count; ++i)
        {
            for (int j = i; j < abundantNums.Count; ++j)
            {
                var sum = abundantNums[i] + abundantNums[j];
                if (sum < 28124) boolArr[sum] = true;
                else break;
            }
        }


        var total = 0;
        for (int i = 0; i < boolArr.Length; i++)
        {
            if (boolArr[i] == false)
            {
                total += i;
            }
        }

        Console.WriteLine(total);
        Console.ReadKey();           
    }

    static bool isAbundant(int num)
    {
        if (getFactors(num).Sum() > num)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

然后找到我所拥有的数字的因素:

    static List<int> getFactors(int num)
    {
        List<int> factors = new List<int>();
        Stopwatch watch = Stopwatch.StartNew();
        for (int i=1; i < Math.Sqrt(num) + 1; i++)
        {
            if (num % i == 0)
            {
                factors.Add(i);
                if (num / i != i)
                {
                    factors.Add(num / i);
                }
            }
        }
        watch.Stop();
        factors.Remove(num);
        return factors;
    }

现在我已经在这一天或两天了,据我所知,这应该是诀窍,任何人都比我能指出我的失败更聪明?

1 个答案:

答案 0 :(得分:1)

问题是你的getFactors循环。变化:

for (int i=1; i < Math.Sqrt(num) + 1; i++)

for (int i=1; i <= Math.Sqrt(num); i++)

它应该有效。我会让你试着理解为什么: - )