Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Чередование чётных и нечётных чисел


Автор: Bladex 28.3.2007, 23:01
Столкулся с такой задачей написать функцию которая проверяет:

Чередуются ли в массиве n четные и нечетные числа. Если они чередуются, то функция должна вернуть 0, а если нет то номер элемента который нарушает это самое чередование

Вариантов перебрал много, но не один из них не работает должным образом, код функции получается просто громадным

Помогите по возможности.

Автор: Kuvaldis 29.3.2007, 00:02
Код

//----------------------------------------------------------------------
#include <conio.h>    
#include <stdio.h>    
//----------------------------------------------------------------------
#define MAXLEN 100
//----------------------------------------------------------------------
int GetMas(int* mas);   // return длину массива

int CheckElements(int* mas, int len); // собственно функция проверки
//----------------------------------------------------------------------
int main(int argc, char* argv[])
{    
    int    mas[MAXLEN];
    int    len, pos;
    
    len = GetMas(mas);
    pos = CheckElements(mas, len);

    printf("index = %d \n", pos);

    getch();
    return 0;
}
//----------------------------------------------------------------------
int GetMas(int* mas)   // return длину массива
{
    int len, i;
    
    puts("Input mas len");
    scanf("%d", &len);
    puts("Input elements");
    
    for (i = 0; i < len; i++)
        scanf("%d", &mas[i] );
    
    return len;
}
//----------------------------------------------------------------------
int CheckElements(int* mas, int len) // собственно функция проверки
{
    int middle, i, k;
    int first;

    first = mas[0] % 2;    // теперь знаем, четное или нечетное первое число

    middle = len / 2; // кол-во пар элементов для проверки

    for (i = 0; i < middle; i++)
    {
        k = 2 * i;

        if ( (mas[k] % 2) != first)    
            return k;  
        k++;
        if ( (mas[k] % 2) == first)    
            return k;
    }

    if (len % 2)   // учтем последний элемент в массиве нечетной длины
    {
        len--;
        if ( (mas[len] % 2) == (mas[len - 1] % 2) )
            return len;
    }

    return 0;

}
//----------------------------------------------------------------------

Автор: agl 29.3.2007, 01:29
Ещё вариант функции:

Код

int check_elements(const int *ar, const int n)
{
    int prev_state = ar[0] & 1;
    for(int i = 1; i < n; i++)
    {
        int cur_state = ar[i] & 1;
        if(prev_state == cur_state) return i; // or return i+1
        prev_state= cur_state;
    }
    return 0;
}

Автор: Bladex 29.3.2007, 21:52
Спасибо за ответы!
Очень помогло. smile 

Автор: Dov 30.3.2007, 19:36
Цитата(Bladex @  28.3.2007,  23:01 Найти цитируемый пост)
Вариантов перебрал много, но не один из них не работает должным образом

Bladex, кроме вариантов, которые предложили Kuvaldis и agl есть ещё вариант, известный ещё со школы(мама дорогая, как же давно это было). И он гласит, что сумма (или разность) двух четных чисел (равно, как и двух не четных) даёт в результате четное число. И только сумма (или разность) четного и не четного числа даёт в результате не четное число. Это правило и можно использовать в твоей программе. Продвигаясь по массиву будем проверять сумму двух рядом стоящих элементов на четность. Если она четная, то вернём порядковый номер(не путать с индексом, если нужен индекс, то нужно возвращать  i, а не  i + 1) правого элемента, стало быть он во всём виноват.  smile   

Цитата(Bladex @  28.3.2007,  23:01 Найти цитируемый пост)
код функции получается просто громадным

 smile   smile  Вообще-то это пару строчек всего.

Код

int check(int* ar, int n)
{
    for(int i = 1; i < n; i++)
        if(!((ar[i] + ar[i - 1]) % 2))
            return i + 1; 
    return 0;    
}

Для проверки:
Код
int main()
{
    int ar[] = {1,2,4,4,5,6,7,8,9,0};
    cout << check(ar, 10) << endl;    
    return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)