Форум программистов, компьютерный форум CyberForum.ru

Удалить из массива все нечетные числа - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Deniza
0 / 0 / 0
Регистрация: 10.09.2012
Сообщений: 5
10.09.2012, 18:35     Удалить из массива все нечетные числа #1
дан массив int a[100].Удалить из массива все нечетные числа
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2012, 18:35     Удалить из массива все нечетные числа
Посмотрите здесь:

Вывести все четные и нечетные числа массива C++
создать одномерный массив заполненый случайными цыфрами. удалить все нечетные элементы массива. среда PascalABC C++
Переписать числа в массив Z по условию. Удалить все нечетные числа C++
C++ Удалить из массива все нечетные элементы
Найти максимальный элемент массива, и удалить после него все нечетные элементы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.09.2012, 18:36     Удалить из массива все нечетные числа #2
Удалить из массива все четные элементы
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
10.09.2012, 18:53     Удалить из массива все нечетные числа #3
C++
1
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
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <random>
#include <functional>
 
class is_odd: public std::unary_function<int, bool>
{
public:
    bool operator ()(const int& num)
    {
        return num % 2 == 1;
    }
};
 
int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dist(0, 10);
    std::vector<int> vec(100);
    std::generate(vec.begin(), vec.end(), std::bind(dist, gen));
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout.put('\n');
    vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd()), vec.end());
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.09.2012, 18:55     Удалить из массива все нечетные числа #4
Цитата Сообщение от Петррр Посмотреть сообщение
return num % 2 == 1;
-3 % 2 == -1
Catstail
Модератор
 Аватар для Catstail
21436 / 10221 / 1666
Регистрация: 12.02.2012
Сообщений: 17,096
10.09.2012, 19:57     Удалить из массива все нечетные числа #5
Вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream.h>
 
int main(int argc, char* argv[])
{
    int Arr[]={1,2,3,-8,5,56,78,13,0,0,-5,5,6};
    int n,i,j;
    n=sizeof(Arr)/sizeof(int);
    cout << "Initial array:" << endl;
    for (i=0; i<n; i++) cout << Arr[i] << " ";
    cout << endl;
    j=0;
    for (i=0; i < n; i++)
        if ((Arr[i]%2) == 0)
            Arr[j++]=Arr[i];
    n=j;
    cout << "Array after filter:" << endl;
    for (i=0; i<n; i++) cout << Arr[i] << " ";
    cout << endl;
    return 0;
}
"и вся любовь..."
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
10.09.2012, 20:01     Удалить из массива все нечетные числа #6
C++
13
return num & 1;
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.09.2012, 20:19     Удалить из массива все нечетные числа #7
Цитата Сообщение от Catstail Посмотреть сообщение
Вот:
У Вас похожий метод
Удалить из массива все четные элементы.
Но есть еще более быстрый алгоритм

Существует самый оптимальный алгоритм решения данной задачи. Если для алгоритмов сортировок, например, все зависит от имеющихся данных, то здесь имеется универсальный алгоритм. То есть если требуется удалить все элементы массива, удовлетворяющие некоторому условию, то лучше использовать самый быстрый алгоритм.
Catstail
Модератор
 Аватар для Catstail
21436 / 10221 / 1666
Регистрация: 12.02.2012
Сообщений: 17,096
10.09.2012, 20:25     Удалить из массива все нечетные числа #8
Цитата Сообщение от Thinker Посмотреть сообщение
Существует самый оптимальный алгоритм решения данной задачи
- куда же оптимизировать?

Неужели, есть способ быстрее этого:

C++
1
2
3
4
j=0;
for (i=0; i < n; i++)
     if ((Arr[i]%2) == 0)
         Arr[j++]=Arr[i];
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.09.2012, 20:26     Удалить из массива все нечетные числа #9
Цитата Сообщение от Catstail Посмотреть сообщение
- куда же оптимизировать?
Есть, поверьте. Представьте, что у Вас массив не чисел, а довольно громоздких объектов, то лишние перезаписывания ни к чему. И такой алгоритм имеется То есть в том алгоритме ни одного лишнего перемещения элементов в массиве
Catstail
Модератор
 Аватар для Catstail
21436 / 10221 / 1666
Регистрация: 12.02.2012
Сообщений: 17,096
10.09.2012, 20:31     Удалить из массива все нечетные числа #10
Цитата Сообщение от Thinker Посмотреть сообщение
Представьте, что у Вас массив не чисел
:

1) в условии-то массив чисел...
2) пусть это будут сколь-угодно сложные объекты, но если они образуют массив, то как обойтись без копий? И какие копии считать лишними?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.09.2012, 20:33     Удалить из массива все нечетные числа #11
Причем тут массив чисел. Я Вам про алгоритм, для которого не важно что там. А про громоздкие объекты к тому, что незачем перезаписывать те числа (объекты), которые должны оставаться на своем месте То есть про алгоритм, который перемещает только те элементы массива, которые должны "переехать", оставляя все остальные элементы на местах. Просто надо подойти к этой задачи несколько математически и понять, что такой алгоритм существует и он прост.
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
10.09.2012, 20:40     Удалить из массива все нечетные числа #12
std::partition?
Catstail
Модератор
 Аватар для Catstail
21436 / 10221 / 1666
Регистрация: 12.02.2012
Сообщений: 17,096
10.09.2012, 20:44     Удалить из массива все нечетные числа #13
Цитата Сообщение от Thinker Посмотреть сообщение
То есть про алгоритм, который перемещает только те элементы массива, которые должны "переехать"
- тут трудно с Вами не согласиться. Модифицирую свой код:

C++
1
2
3
4
5
6
7
j=0;
for (i=0; i < n; i++)
     if ((Arr[i]%2) == 0)
        if (i != j)
            Arr[j++]=Arr[i];
        else
            j++;
Пойдет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2012, 20:47     Удалить из массива все нечетные числа
Еще ссылки по теме:

C++ Удалить из массива только повторяющиеся нечетные числа
Вывести все четные числа массива в порядке возрастания их индексов, а затем все нечетные в порядке убывания C++
Удалить все нечетные элементы одномерного массива C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.09.2012, 20:47     Удалить из массива все нечетные числа #14
Что-то похожее, но можно с меньшим количеством проверок. В этой ветке похожая задача
Нужно из массива удалить нулевые элементы
в посте #11 алгоритм

Для данной задачи:
C++
1
2
3
4
for (m = 0; m < n && !(a[m] & 1); m++)
   ;
for(i = m + 1;  i < n; i++) 
  if (a[i] & 1)  a[m++] = a[i];
После работы алгоритма в m останется "новый" размер массива и ни одного лишнего перезаписывания
Добавлено через 33 секунды
Цитата Сообщение от Петррр Посмотреть сообщение
std::partition?
немного не то
Yandex
Объявления
10.09.2012, 20:47     Удалить из массива все нечетные числа
Ответ Создать тему
Опции темы

Текущее время: 23:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru