Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

С# - Вывод четных элементов в порядке убывания их индексов без условного оператора.

Demi Blackcrane Профи (751), на голосовании 6 лет назад
В суть программы вдаваться особо не буду. Мне надо прописать кусок программы так, чтобы мне выводились четные элементы в порядке убывания их индексов, и все это без условного оператора. Пытался в for прописывать, но не получается. Заранее спасибо.
Голосование за лучший ответ
Mr. Perfectly Fine Оракул (63004) 6 лет назад
Элеменнты с чётными индексами:
for (int i = A.Length - 2 + (A.Length & 1); i >= 0; i -= 2) { … }

Элементы с нечётными:
for (int i = A.Length - 1 - (A.Length & 1); i >= 0; i -= 2) { … }
NommydeГуру (2743) 6 лет назад
Вы путаете чётность элементов массива с чётностью их индексов
Mr. Perfectly Fine Оракул (63004) Я ничего не путаю, путаницу вносят идиоты, которые говорят о чётности элементов в контексте чётности их значений. Различайте элемент и значение.
Demi BlackcraneПрофи (751) 6 лет назад
Поменял с четными на "int i = A.Length - 1 - (A.Length & 1)" и все получилось. Спасибо большое
Nommyde Гуру (2743) 6 лет назад
Можно сделать два цикла, которые работают по очереди. Один выводит чётные, другой пропускает нечётные:

int i = A.Length - 1;

while (i >= 0) {
while (i >= 0 && (A[i] % 2 == 0)) Console.WriteLine(A[i--]);
while (i >= 0 && (A[i] % 2 == 1)) i--;
}
Jurijus Zaksas Искусственный Интеллект (426852) 6 лет назад
for (int i = a.Length >> 1 << 1; i >= 0; i----)

Это если тебе нужны четные индексы.
А если нужно проверять четность самих значений без if, то есть вот такой формально попадающий под это дело метод:

while( !(bool)(a[i] & 1))
{
Console.WriteLine(a[i]);
break;
}
NommydeГуру (2743) 6 лет назад
В первом случае, если a.Length чётное, то первая итерация произойдёт с i == a.Length. То есть за границей массива.

Во втором случае какой-то странный у вас метод. i не изменяется, в теле цикла безусловный break. Выведется либо ничего, либо один элемент.
Jurijus Zaksas Искусственный Интеллект (426852) Первый случай надо доработать. for (int i = (a.Length - 1) >> 1 << 1; i >= 0; i----) Во втором показан просто способ проверки на четность без if, внешнего цикла там я не нарисовал.
Mr. Perfectly FineОракул (63004) 6 лет назад
Можно полностью без булевых операций (кроме условия выхода из цикла)
Action<int>[] Print = { (x) => { Console.Write(x + "\t"); }, (x) => { } };
for (int i = k.Length - 1; i >=0; --i) Print[k[i] & 1](k[i]);
Похожие вопросы