Алгоритм перестановки элементов - C (СИ)

  1. Здравствуйте. Кто нибудь подскажите алгоритм перестановки элементов таким образом: дан вектор исходный: 7894136 выходной: 6578941 перестановка производиться таким образом, что элемент в четной ячейке переходит в следующую четную,последняя четная в первую четную, а первая нечетная в сл неченую, п последняя нечетная в первую.


textual

Код к задаче: «Алгоритм перестановки элементов - C (СИ)»

#include <stdbool.h>
#include <stdio.h>
 
// Является ли данный индекс нечетным?
 
bool is_odd(int idx)
{
    return idx & 1;
}
 
// Следующая нечетная ячейка
 
int next_odd_index(int idx, const size_t siz)
{
    idx += 2;
    if( idx >= siz ) idx = 1;
    return idx;
}
 
// Следующая четная ячейка
 
int next_even_index(int idx, const size_t siz)
{
    idx += 2;
    if( idx >= siz ) idx = 0;
    return idx;
}
 
int main (int argc, char* argv[])
{
    const size_t siz = argc - 1;
    if( siz ) {
        int input_vector[siz];
        int output_vector[siz];
        int i = 0;
 
        do {
            input_vector[i] = atoi(argv[++i]);
        } while( i != siz );
 
        for( i = 0; i < siz; ++i ) {
            if( is_odd(i) ) {
                output_vector[ next_odd_index(i, siz) ] = input_vector[i];
            } else {
                output_vector[ next_even_index(i, siz) ] = input_vector[i];
            }
        }
 
        for( i = 0; i < siz; ++i ) {
            printf("output_vector[%d] = %d\n", i, output_vector[i]);
        }
    }
    return 0;
}

СДЕЛАЙТЕ РЕПОСТ

6   голосов, оценка 3.833 из 5



Похожие ответы
  1. Нужно описать алгоритм этой программы. Написать, что делает каждая строка в этом коде. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 printf("Введите время вылета и прилета с А в Б (hh:mm)\n");        for(i = 0; i < 4; i++)      {         scanf("%d:%d", &h[i], &m[i]);         t[i] = (h[i]*60 + m[i]);          if(h[i]>=24)        {         printf("Недопустимое значение\n");         system("pause");           return main();        }         if(m[i]>60)        {         printf("Недопустимое значение\n");         system("pause");           return main();         }         if (i==1)         {             printf("Введите время вылета и прилета с Б в А (hh:mm)\n");              continue;         }      }              if(t[0]>t[1])          t[1] += 24*60;          if(t[2]>t[3])          t[3] += 24*60;           r = fabs((double)(t[1] - t[0] + t[3] - t[2]) / 2+0.5);           rh = (r%(24*60)) / 60;         rm = r % 60;            printf("Время полета : %2.2d:%2.2d\n", rh, rm);          system("pause");         return main();

  1. Не получается разработать алгоритм вычисления значения переменной y по заданной формуле для вводимых значений переменных a, b и с. Алгоритм представить в виде программы для ЭВМ на алгоритмическом языке Си.

  1. Помогите написать программу в С. Найти наибольшую клику в заданном орграфе, используя алгоритм нахождения независимых множеств Сам метод: Клика Антиподом понятия независимого множества является понятие клики. Подмножество U вершин графа G называется кликой, если любые две входящие в него вершины смежны, т.е. если порожденный подграф G(U) является полным. Клика называется максимальной, если она не содержится в клике с большим числом вершин, и наибольшей, если число вершин в ней наибольшее среди всех клик. Число вершин в наибольшей клике графа G называется его плот-ностью (или кликовым числом) и обозначается через (G). Как и в случае независимых множеств, максимальная клика графа может оказаться не наибольшей. Понятие клики, в частности максимальной клики, используется в различных социологических теориях ( вопросы, связанные с голосованием, альянсами и т.п.), а также в теории игр. Очевидно следующее утверждение: подмножество вершин графа G является кликой тогда и только тогда, когда оно является независимым множеством в дополнительном графе G*. Вот то, что я начал писать:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include #include   #define M 120   int n, g[M][M], f[M][M]; int main() {     printf("Vvedite n= %d", n);     for (int i = 0; i < n; i++)         for (int j = 0; j < n; j++)             printf("%d", g[i][j]);       scanf("%d", &n);     for (int i = 0; i < n; i++)         for (int j = 0; j < n; j++)             scanf("%d", &g[i][j]);       for (int i = 0; i < n; i++)         for (int j = 0; j < n; j++)             if (g[i][j] == 0)                 g[i][j] = 1;             else                 g[i][j] = 0;       for (int i = 0; i < n; i++)         for (int j = 0; j < n; j++)             printf(" %d \n", g[i][j]);       getch();       return 0; }

  1. Заинтересовал вопрос о различных реализациях алгоритма Евклида для неотрицательных целых чисел. Ниже привожу алгоритмы, собственноручно написанные, исходя из теоретического материала. Каждый алгоритм можно модифицировать в ту или иную сторону. Считается, что бинарный алгоритм работает быстрее, но мои тесты показывают, что два первых алгоритма работают быстрее бинарного. Может ли кто перепроверить на скорость на своих компиляторах, а то очень интересно и не видится никаких преимуществ бинарного алгоритма.C1 2 3 4 5 6 7 8 9 10 //обычный алгоритм Евклида через остатки long Nod(long a, long b) {     while (a && b)         if (a >= b)            a %= b;         else            b %= a;     return a | b; }C1 2 3 4 5 6 7 8 9 10 // Алгоритм Евклида через разности long Nod(long a, long b) {     while (a && b)         if (a >= b)            a -= b;         else            b -= a;     return a | b; }C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 // Бинарный алгоритм Евклида long Nod(long a, long b) {     long deg = 0;     if (a == 0 || b == 0)         return a | b;     while (((a | b) & 1) == 0)     {         deg++;         a >>= 1;         b >>= 1;     }     while (a && b)     {         if (b & 1)             while ((a & 1) == 0)                 a >>= 1;         else             while ((b & 1) == 0)                 b >>= 1;         if (a >= b)             a = (a - b) >> 1;         else             b = (b - a) >> 1;     }     return ((a | b) << deg); }Еще один бинарный алгоритм, но он самый медленный из всех предыдущих.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 long Nod(long a, long b) {     long buf, deg = 0;     if (a == 0 || b == 0)         return a | b;     while (((a | b) & 1) == 0)     {         deg++;         a >>= 1;         b >>= 1;     }     if (a)         while ((a & 1) == 0)             a >>= 1;     while (b)     {         while ((b & 1) == 0)             b >>= 1;         if (a < b)             b -= a;         else         {             buf = a - b;             a = b;             b = buf;         }         b >>= 1;     }     return (a << deg); }

  1. Составить алгоритм и программу сортировки элементов двумерного квадратного массива размером N (N> 5) по указанным правилам. (Стрелка указывает направление от меньшего к большему элемента). Сначала , думаю, стоит диагональ перевести в одномерный массив и отсортировать его. Потом занести обратно в массив 2-мерный. 2) Начать сортировать в таком порядке : (см. рисунок) Вот так думал решать, и вродь правильно, а отразить в коде не получается.

  1. Дана трех значное число.вывести число,полученное при перестановки цифр сотен и десятков исходного числа(например,123 перейти 213).

  1. Добрый день! Помогите, пожалуйста, новичку написать программу. Никак не могу понять, как составить условия.

  1. Доброго времени суток, дамы и господа! Может-ли кто-нибудь подсказать в какую сторону мне копать? Я новичок. И так, задание. Реализовать проверку валидности карт по вводу 15-16-ти значного номера за алгоритмом луна для AMEX, MasterCard и Visa. Т.е. пользователь вводит номер, а ему пишут чья это карта и валидна-ли она за этим алгоритмом. В обшем, т.к. я новичок, то я просто не знаю с чего мне начать. Подскажите, а?

  1. Здравствуйте,требуется на основе алгоритмов прямого поиска; Кнута, Морриса и Пратта; Боуера и Мура реализовать алгоритмы поиска подстроки в строке. Самый простой способ. Спасибо