Вы можете сделать что-то вроде этого:
Func<int,int> Euler = total=>
new List<int>() {3,5}
.Select(m => ((int) (total-1) / m) * m * (((int) (total-1) / m) + 1) / 2)
.Aggregate( (T, m) => T+=m);
У вас все еще есть проблема двойного счета. Я подумаю об этом немного больше.
Edit:
Вот рабочее (хотя и несколько не элегантное) решение в LINQ:
var li = new List<int>() { 3, 5 };
Func<int, int, int> Summation = (total, m) =>
((int) (total-1) / m) * m * (((int) (total-1) / m) + 1) / 2;
Func<int,int> Euler = total=>
li
.Select(m => Summation(total, m))
.Aggregate((T, m) => T+=m)
- Summation(total, li.Aggregate((T, m) => T*=m));
Кто-нибудь из вас, ребята, может улучшить это?
Пояснение:
Помните, что формула суммирования для линейной прогрессии равна n (n + 1) / 2. В первом случае, когда у вас есть кратные 3,5 <10, вы хотите Сумма (3 + 6 + 9,5). Установив total = 10, вы делаете последовательность из целых чисел 1 .. (int) (total-1) / 3, а затем суммируете последовательность и умножаете на 3. Вы можете легко увидеть, что мы просто устанавливаем n = (int ) (total-1) / 3, затем с помощью формулы суммирования и умножения на 3. Маленькая алгебра дает нам формулу для функтора суммирования. </p>