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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KattyBelka
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 10
#1

Удалить самую длинную цепочку четных элементов - C++

14.06.2013, 19:20. Просмотров 569. Ответов 4
Метки нет (Все метки)

Помогите пожалуйста с задачей.

Удалить самую длинную цепочку четных элементов.
Полученный массив отсортировать по возрастанию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2013, 19:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить самую длинную цепочку четных элементов (C++):

В одномерном массиве найти самую длинную цепочку подряд стоящих элементов, которая является «палиндромом» - C++
в одномерном массиве найти самую длинную цепочку подряд стоящих элементов, которая является «палиндромом». В такой цепочке первое число...

Цикл: Найти самую длинную неубывающую цепочку чисел - C++
В цикле с клавиатуры вводится 15 целых чисел. Необходимо найти самую длинную неубывающую цепочку чисел. На экран вывести найденную...

Найти самую длинную возрастающую цепочку простых чисел - C++
Привет всем Решаю задачку: Найти самую длинную возрастающую цепочку простых чисел В заданном бинарном файле необходимо ...

Найдите в матрице самую длинную цепочку подряд идущих нулей по горизонтали и вертикали - C++
Матрица состоит из нулей и единиц. Найдите в ней самую длинную цепочку подряд идущих нулей по горизонтали, вертикали. Удалить...

Найти в матрице самую длинную цепочку подряд стоящих 0 по горизонтали или вертикали - C++
Матрица состоит из 0 и 1. Найти в ней самую длинную цепочку подряд стоящих 0 по горизонтали или вертикали. Для ориентации поиска...

найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц - C++
Нужно найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц. В чем ошибка ? #include <iostream> #include...

4
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.06.2013, 21:38 #2
Кликните здесь для просмотра всего текста
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <random>
 
void print( std::vector<int>& v )
{
    for( const auto& i : v )
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;
}
 
bool isEven( int value )
{
    return value % 2 == 0;
}
 
int main()
{
    const int size = 10;
    std::vector<int> v(size);
    
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis( 1, 100 );
    // Заполнить вектор
    std::generate( begin(v), end(v), [&]() { return dis( gen ); } );
 
    print( v );
    
    typedef std::vector<int>::iterator viter;
    std::pair<viter, viter> range( end(v), end(v) );
 
    auto it = std::begin( v );
 
    // Найти цепочку четных элементов
    while( it != std::end( v ) )
    {
        auto start = std::find_if( it, std::end(v), isEven );
        if( start == std::end(v) ) break;
        auto end = std::find_if_not( start, std::end(v), isEven );
 
        if( std::distance( start, end ) > std::distance( range.first, range.second ) )
        {
            range.first = start;
            range.second = end;
        }
        it = end;
    }
 
    if( range.first != std::end(v) )
    {
        std::cout << "Even sequence: " << *range.first << "..." << *std::prev(range.second) << std::endl;       
        // Удалить последовательность четных
        v.erase( range.first, range.second );
        print( v );
    }
    else
    {
        std::cout << "Has not even elements\n"; 
    }
 
    // Сортируем
    std::cout << "Sorted:\n";
    std::sort( std::begin(v), std::end(v) );
    print( v );
 
    std::system( "pause" );
}
1
KattyBelka
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 10
18.06.2013, 09:54  [ТС] #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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <cstdlib>
#include <vector>//автоматическое изменение размеров вектора при вставке или удалении элементов
#include <algorithm>
#include <random>
using namespace std;
void print(vector<int>& v )//процедура вывода вектора на экран 
{
    for( const auto& i : v)
    {
        cout << i << " ";
    }
    cout <<"\n";
}
 
bool isEven( int value )
{
    return value % 2 == 0;//поиск четных элементов
}
int main()
{
    setlocale(LC_CTYPE,"Russian");
    const int size = 10;
    vector<int> v(size);//Создаем вектор, состоящий из size элемента типа int, значение которых равно 0   
    random_device rd;
    mt19937 gen(rd());
    uniform_int_distribution<> dis( 1, 100 );//генератор случайных чисел от 1 до 100
    // Заполнить вектор
    generate( begin(v), end(v), [&]() { return dis( gen ); } );
    print( v );//вызов функции
    typedef vector<int>::iterator viter;//создает один или более у-ней косвенного обращения между именами и его базовым типом
    pair<viter, viter> range( end(v), end(v) );/*(pair класс, который может хранить пару объектов в своих членах first и second)
    логическое объединение 2-х переменных 
    (range возвращает диапазон, в который можно вставить элемент, не нарушая порядок некоторой последовательности)*/
    auto it = begin( v );
    // Найти цепочку четных элементов
    while( it != end( v ) )
    {
        auto start = find_if( it, end(v), isEven );//(find_if возвращает итератор на первый элемент в диапазоне [begin,end), а предыдущему возращает true)
        if( start == end(v) ) break;
        auto end = find_if_not( start, std::end(v), isEven);
 
        if( distance( start, end ) > distance( range.first, range.second ) )
        {
            range.first = start;
            range.second = end;
        }
        it = end;
    }
    if( range.first != end(v) )
    {
        cout << "Цепочка четных элементов: " << *range.first << "..." << *prev(range.second) <<"\n";       
        // Удалить последовательность четных
        v.erase( range.first, range.second );
        print( v );//вызов функции
    }
    else
    {
        cout << "Нет четных элементов\n"; 
    }
 
    // Сортируем
    cout << "Отсортированная матрица:\n";
    sort(begin(v),end(v) );
    print( v );//вызов функции
}
Это та же самая программа просто немного поправленная в моем стиле=)
Особенно мне не понятно как работает цикл while (его начало)
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.06.2013, 10:44 #4
range - это просто переменная типа std:air, которая хранит пару итераторов, указывающих на последовательность четных чисел.
find_it - возвращает итератор на эл-нт, который удовлетворяет предикату (критерию четности в данном случае). Т.е. находим первый четный эл-нт.
Цитата Сообщение от KattyBelka Посмотреть сообщение
Отсортированная матрица
матрица-то откуда?
0
KattyBelka
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 10
18.06.2013, 13:57  [ТС] #5
Матрица здесь потому что задание было дано сделать программу через массив. Ну в принципе вектор это как бы одномерный массив. Так что думаю пойдет=)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2013, 13:57
Привет! Вот еще темы с ответами:

Требуется найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц - C++
Требуется найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц. Входные данные: В единственной строке...

Требуется найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц - C++
Здравствуйте, не могу понять в чём может быть ошибка :) Решаю олимпиадную задачу. Но система находит в тесте 5 не верный ответ) В...

String char айти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц - C++
Требуется найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц При этом в файл всегда сохраняется &quot;1&quot;....

Матрица L(n,k) состоит из нулей и единиц. Найти в ней самую длинную цепочку подряд стоящих нулей по горизонтал - C++
Помогите решить на C++ QtCreator


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
18.06.2013, 13:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru