Перебрать нечетные числа и 2 - PullRequest
0 голосов
/ 11 сентября 2018

Возможно ли в C иметь быстрый цикл for / while, который перебирает нечетные числа и 2?Без использования массивов.

Так что я бы хотел, чтобы он прошел через {1, 2, 3, 5, 7, 9, ..}

Ответы [ 4 ]

0 голосов
/ 12 сентября 2018
#include <stdio.h>

int main()
{
    for(unsigned x = 0; x < 10; x++)
    printf("%u%s element - %u\n",x + 1, !x ? "st" : x == 1 ? "nd" : x == 2 ? "rd" : "th", !x + x * 2 - (x >= 2));

    return 0;
}

в !x + x * 2 - (x >= 2) вычисление переходов не выполняется, поэтому конвейер не очищается.

0 голосов
/ 11 сентября 2018

Другая альтернатива, которая использует массив, но только маленький, который имеет постоянный размер двух элементов, независимо от того, сколько чисел в последовательности будет:

{
    int i;
    int  iray[] = {1, 2};
    int n = 15;

    for (i = 1; i < n; i += iray[i > 2]) {
        printf (" i = %d \n", i);
        // code
    }
}

, который производит:

i = 1
i = 2
i = 3
i = 5
i = 7
i = 9
i = 11
i = 13

Распространение этой альтернативы на другие последовательности

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

1, 2, 3, 5, 8, 11, ..

Что включает в себя несколько изменений в последовательности. Начиная с 1, используется приращение 1, за которым следует первое изменение приращения, начинающееся с 3, когда используется приращение 2, за которым следует второе изменение в последовательности, начинающейся с 5, когда используется приращение 3, вы можете внести следующие изменения .

{
    int i;
    int  iray[] = {1, 2, 3};  // increment changes
    int n = 15;

    // calculate the increment based on the current value of i
    for (i = 1; i < n; i += iray[(i > 2) + (i > 3)]) {
        printf (" i = %d \n", i);
        // code
    }
    return 0;
}

что даст:

 i = 1
 i = 2
 i = 3
 i = 5
 i = 8
 i = 11
 i = 14
0 голосов
/ 11 сентября 2018

Другой вариант

for(int i=1;;++i) // you didn't specify a limit
{
    switch(i)
    {
        default:
            if(!(i&1))continue;
        case 1:
        case 2:
            DoSomething(i):
    }
}
0 голосов
/ 11 сентября 2018

Конечно. Вот довольно прямой путь.

for(int i=1; i<N; i++) {
    if(i>3) i++;
    // Code
}

Немного более хакерский вариант:

for(int i=1; i<N; i+=1+(i>2)) {
     // Code
}

Но я думаю, что в этом случае наиболее читаемый вариант будет выглядеть примерно так:

// Code for 1 and 2

// Then code for 3,5,7 ...
for(int i=3; i<N; i+=2) {
    // Code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...