Project Euler: Problem 1 (Possible refactorings and run time optimizations)

前端 未结 13 2068
半阙折子戏
半阙折子戏 2020-12-11 08:35

I have been hearing a lot about Project Euler so I thought I solve one of the problems in C#. The problem as stated on the website is as follows:

If w

13条回答
  •  青春惊慌失措
    2020-12-11 08:59

    You can do something like this:

    Func Euler = total=> 
        new List() {3,5}
            .Select(m => ((int) (total-1) / m) * m * (((int) (total-1) / m) + 1) / 2)
            .Aggregate( (T, m) => T+=m);
    

    You still have the double counting problem. I'll think about this a little more.

    Edit:

    Here is a working (if slightly inelegant) solution in LINQ:

            var li = new List() { 3, 5 };
            Func Summation = (total, m) => 
               ((int) (total-1) / m) * m * (((int) (total-1) / m) + 1) / 2;
    
            Func Euler = total=> 
                li
                    .Select(m => Summation(total, m))
                    .Aggregate((T, m) => T+=m)
                - Summation(total, li.Aggregate((T, m) => T*=m));
    

    Can any of you guys improve on this?

    Explanation:

    Remember the summation formula for a linear progression is n(n+1)/2. In the first case where you have multiples of 3,5 < 10, you want Sum(3+6+9,5). Setting total=10, you make a sequence of the integers 1 .. (int) (total-1)/3, and then sum the sequence and multiply by 3. You can easily see that we're just setting n=(int) (total-1)/3, then using the summation formula and multiplying by 3. A little algebra gives us the formula for the Summation functor.

提交回复
热议问题