Не может вполне добраться Euler проблема Проекта № 2 выяснила

В то время как я соглашаюсь, что лучше использовать встроенное foreach конструкция в большинстве случаев, я нахожу использование этого изменения на ForEach<> расширение, чтобы быть немного более хорошим, чем необходимость управлять индексом в постоянном клиенте foreach самостоятельно:

public static int ForEach<T>(this IEnumerable<T> list, Action<int, T> action)
{
    if (action == null) throw new ArgumentNullException("action");

    var index = 0;

    foreach (var elem in list)
        action(index++, elem);

    return index;
}
Пример
var people = new[] { "Moe", "Curly", "Larry" };
people.ForEach((i, p) => Console.WriteLine("Person #{0} is {1}", i, p));

дал бы Вам:

Person #0 is Moe
Person #1 is Curly
Person #2 is Larry
8
задан iCodez 22 January 2015 в 18:45
поделиться

4 ответа

Вы используете y как в качестве переменной цикла, так и в качестве второго члена в последовательности.

То, что вы хотите сделать, это:

int x = 0;
int y = 1;
int z;
int sum = 0;

do {
    z = x + y;
    x = y;
    y = z;
    if (y % 2 == 0) sum += y;
} while (y <= 4000000);

Обратите внимание, что вам, вероятно, следует также инициализировать сумму .

19
ответ дан 5 December 2019 в 04:35
поделиться

Сумма не инициализируется нулем.

5
ответ дан 5 December 2019 в 04:35
поделиться

Для повышения скорости обратите внимание, что последовательность: четный-нечетный-нечетный (повторяется), чет-нечетный-нечетный.

Вам не нужно проверять каждое число, чтобы узнать, это четное или нечетное. Просто добавьте каждое третье число.

15
ответ дан 5 December 2019 в 04:35
поделиться

Блок кода цикла for должен иметь вид

while(y <= 4000000) {
    z = x + y;
    x = y;
    y = z;
    if(y % 2 == 0) {
        sum += y;
    }
}

По сути, вы не должны увеличивать y.

3
ответ дан 5 December 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: