Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 28
1

Сколько нужно убрать из данной последовательности скобок, чтобы получить правильную последовательность?

16.10.2014, 18:07. Показов 1821. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сколько надо убрать скобок
из данной последовательности скобок что бы получить правильную последовательность?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2014, 18:07
Ответы с готовыми решениями:

Сколько слагаемых нужно взять из последовательности, чтобы получить указанное число
Не так давно начал работать с VB (около полугода) решал не сложные задачи и уже стою на цикле с...

Сколько чисел нужно взять в последовательности чтобы получить число, больше чем N?
Сколько чисел нужно взять в последовательности чтобы получить число, больше чем N?

Сколько чисел нужно взять в последовательности 1+1/2+1/3+1/4.+…, чтобы получить число большее, чем N
1. Сколько чисел нужно взять в последовательности 1+1/2+1/3+1/4.+…, чтобы получить число большее,...

Сколько чисел нужно взять в последовательности , чтобы получить число, больше чем N
Доброго времени суток. Уважаемые господа помогите с решением задачи! Сколько чисел нужно взять в...

12
55 / 56 / 37
Регистрация: 06.02.2013
Сообщений: 257
Записей в блоге: 1
16.10.2014, 18:10 2
andreye, то есть сделать так ((( ))(()))))) и результат должен быть такой 3?
0
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 28
16.10.2014, 18:10  [ТС] 3
К примеру ())(() ответ 2
0
55 / 56 / 37
Регистрация: 06.02.2013
Сообщений: 257
Записей в блоге: 1
16.10.2014, 18:29 4
andreye, не понятный пример, приведи другой! Я не могу понять, как ты хочешь, чтобы программа считала

Добавлено через 2 минуты
andreye, ты хочешь, чтобы считали лишние скобки (()()))((())) и оставались только ()()()???
0
100 / 100 / 47
Регистрация: 19.11.2012
Сообщений: 195
16.10.2014, 18:34 5
Попробуйте это:
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
#include <iostream>
#include <string>
 
int main() {
    //std::string expression("((())(())))))");
    std::string expression("())(()");
    int count=0; // для открывающих ++, для закрывающих --
    int error=0; // число скобок на удаление
 
    for(size_t i=0; i<expression.size(); i++) {
        if(expression[i] == '(') { // открывающая, значит ++
            count++;
            continue;
        }
        if(expression[i] == ')') { // закоывающая
            if(count==0) // если все открывающие обеспечены
                error++; // ошибка
            else
                count--; // иначе обеспечиваем открывающую
        }
    }
    error+=count; // добавляем число не обеспеченных открытых
 
    std::cout << "error = " << error << std::endl;
    return 0;
}
0
Guardian of Asgaard
377 / 319 / 197
Регистрация: 11.11.2013
Сообщений: 1,046
16.10.2014, 18:36 6
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
#include <iostream>
 
 using namespace std;
 
int main() {
    int counterIn = 0;
    int counterOut = 0;
    char sign;
    
    for ( ; cin >> sign && sign != '\0'; ) {
        if ( sign == '(' ) {
            counterIn += 1;
        }
        if ( sign == ')' ) {
            counterOut += 1;
        }
    }
    counterIn -= counterOut;
    
    if ( counterIn < 0 ) {
        counterIn *= -1;
    }
    
    cout << counterIn << endl;
    
    return 0;
}
Код
@stdin:
()))
@stdout:
2
0
55 / 56 / 37
Регистрация: 06.02.2013
Сообщений: 257
Записей в блоге: 1
16.10.2014, 18:37 7
andreye, TrueBit, Может лучше это?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
 
using namespace std;
int main()
{
    setlocale(0,"Rus");
    char str[255];
    int count=0;
    cout<<"Ââåäèòå ñòðîêó: ";
    cin>>str;
    for (int i=0; i<strlen(str); i++)
    {
        if (str[i]=='(' && str[i+1]==')')
           count--;
        else count++;
    }
    cout<<count<<endl;
    system("pause");
    return 0;
}
0
100 / 100 / 47
Регистрация: 19.11.2012
Сообщений: 195
16.10.2014, 18:43 8
Цитата Сообщение от andreye Посмотреть сообщение
Сколько надо убрать скобок
из данной последовательности скобок что бы получить правильную последовательность?
Цитата Сообщение от Константин_2012 Посмотреть сообщение
andreye, TrueBit, Может лучше это?
для изначально правильной последовательности:
Bash
1
(())
просит удалить 2 скобки
0
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 28
16.10.2014, 18:52  [ТС] 9
А как ето сделать на паскаль
0
100 / 100 / 47
Регистрация: 19.11.2012
Сообщений: 195
16.10.2014, 18:53 10
Цитата Сообщение от TrueBit Посмотреть сообщение
andreye, TrueBit, Может лучше это?
Еще при длине строки 4:
Bash
1
(())
strlen(str) вернет значение 4, тогда в цикле
C++
1
for (int i=0; i<strlen(str); i++)
максимальное значение, которое примет i Будет i<4, то есть 3, а значит для
C++
1
if (str[i]=='(' && str[i+1]==')')
будет выполнено на последней итерации
C++
1
if (str[3]=='(' && str[4]==')')
но нумерация идет с нуля, поэтому str[4] - пятый элемент, которого в строке нет. То есть выход за границы массива. В данном случае программа не упадет, поскольку str[255]. И в той ячейке будет записан 0

Цитата Сообщение от andreye Посмотреть сообщение
А как ето сделать на паскаль
Это раздел по c++. Для pascal есть соответствующий раздел.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
16.10.2014, 19:07 11
andreye, при чём тут Паскаль? Учи Си!

Добавлено через 12 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <string>
#include <stack>
#include <iostream>  
using namespace std;
int main(){
    int cnt=0;
    string str;
    stack<int> stk;
    getline(cin, str);
    for (int i=0; i<str.size(); ++i){
       if (str[i]=='('){
            stk.push(i);
            continue;
       }
       if (str[i]==')'){
            if (stk.empty()) ++cnt;
            else             stk.pop();
       }
    }
    cnt+=stk.size();
    cout<<cnt;
    return 0;
}
0
55 / 56 / 37
Регистрация: 06.02.2013
Сообщений: 257
Записей в блоге: 1
16.10.2014, 20:27 12
TrueBit, да, ошибки есть, я с работы уже уезжать собирался и упустил это всё дело, да и не проверял программу. Спасибо
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
16.10.2014, 23:16 13
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/////////////////////////////////////////////////////////////////////////////////////////
//Сколько надо убрать скобок из данной последовательности скобок чтобы получить правильную 
//последовательность?
//К примеру ())(() ответ 2
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <ctime>
#include <iostream>
#include <iterator>
#include <random>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
const   char    LEFT_BRACKET    =   '(';
const   char    RIGHT_BRACKET   =   ')';
const   char    SPACE_SYMB      =   ' ';
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                             T_str;
typedef T_str::size_type                        T_pos;
typedef std::uniform_int_distribution< char >   T_char_distribution;
/////////////////////////////////////////////////////////////////////////////////////////
T_str   get_rand_brackets_sequence_with_len( int    len )
{
    static  std::default_random_engine  rand_generator      (   unsigned(time(0))               );
    static  T_char_distribution         char_distribution   (   LEFT_BRACKET,   RIGHT_BRACKET   );
 
    T_str   res;
 
    std::generate_n
        (
            std::back_inserter( res ),
            len,
 
            [&] ()
            {
                return  char_distribution( rand_generator );
            }
        );
 
    return  res;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    for_brackets_sequence_set_extra_brackets_and_correct_sequence_and_counter
    (
        T_str   const   &   brackets_sequence,
        T_str           &   extra_brackets,
        T_str           &   correct_brackets_sequence,
        int             &   correct_brackets_counter
    )
{
    extra_brackets  =   brackets_sequence;
 
    correct_brackets_sequence   =   T_str   (
                                                brackets_sequence.size(),
                                                SPACE_SYMB
                                            );
 
    correct_brackets_counter    =   0;
 
    for( size_t  substr_len = 2; substr_len <= brackets_sequence.size(); substr_len += 2 )
    {
        T_str   substr  (
                            substr_len,
                            SPACE_SYMB
                        );
 
        substr.front    ()  =   LEFT_BRACKET;
        substr.back     ()  =   RIGHT_BRACKET;
 
        for(;;)
        {
            auto    pos     =   extra_brackets.find( substr );
 
            if( pos     ==  T_str::npos )
            {
                break;
            }
 
            correct_brackets_counter    +=  2;
 
            extra_brackets.replace              ( pos,                      1,  1,  SPACE_SYMB      );
            extra_brackets.replace              ( pos + substr_len - 1,     1,  1,  SPACE_SYMB      );
 
            correct_brackets_sequence.replace   ( pos,                      1,  1,  LEFT_BRACKET    );
            correct_brackets_sequence.replace   ( pos + substr_len - 1,     1,  1,  RIGHT_BRACKET   );
        }//for
    }//for
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    const   int     RAND_BRACKETS_SEQ_LEN   =   10;
 
    for(;;)
    {
        T_str   rand_brackets_sequence      =   get_rand_brackets_sequence_with_len( RAND_BRACKETS_SEQ_LEN );
        T_str   extra_brackets;
        T_str   correct_brackets_sequence;
        int     correct_brackets_counter    =   0;
 
        for_brackets_sequence_set_extra_brackets_and_correct_sequence_and_counter
            (
                rand_brackets_sequence,
                extra_brackets,
                correct_brackets_sequence,
                correct_brackets_counter
            );
 
        std::cout   <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  "В последовательности скобок"
                    <<  std::endl
                    <<  rand_brackets_sequence
                    <<  std::endl
                    <<  "нужно убрать скобки "
                    <<  std::endl
                    <<  extra_brackets
                    <<  std::endl
                    <<  "в количестве "
                    <<  RAND_BRACKETS_SEQ_LEN - correct_brackets_counter
                    <<  ", чтобы получить корректную последовательность "
                    <<  std::endl
                    <<  correct_brackets_sequence
                    <<  std::endl;
 
        system("pause");
    }//for
}
Добавлено через 2 часа 15 минут
Через стек вот так проще:
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/////////////////////////////////////////////////////////////////////////////////////////
//Сколько надо убрать скобок из данной последовательности скобок чтобы получить правильную 
//последовательность?
//К примеру ())(() ответ 2
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <ctime>
#include <iostream>
#include <iterator>
#include <random>
#include <stack>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
const   char    LEFT_BRACKET    =   '(';
const   char    RIGHT_BRACKET   =   ')';
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                             T_str;
typedef std::uniform_int_distribution< char >   T_char_distribution;
/////////////////////////////////////////////////////////////////////////////////////////
T_str   get_rand_brackets_sequence_with_len( int    len )
{
    static  std::default_random_engine  rand_generator          (   unsigned(time(0))               );
    static  T_char_distribution         brackets_distribution   (   LEFT_BRACKET,   RIGHT_BRACKET   );
 
    T_str   res;
 
    std::generate_n
        (
            std::back_inserter  ( res ),
            len,
 
            [&]                 ()
            {
                return  brackets_distribution( rand_generator );
            }
        );
 
    return  res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     count_extra_brackets( T_str   const   &   brackets_sequence )
{
    std::stack< char >  stack;
 
    std::for_each
        (
            brackets_sequence.begin     (),
            brackets_sequence.end       (),
 
            [&]                         ( char  c )
            {
                if  (
                            c                   ==  RIGHT_BRACKET
                        &&  !stack.empty    ()
                        &&  stack.top       ()  ==  LEFT_BRACKET
                    )
                {
                    stack.pop   ();
                }
                else
                {
                    stack.push  ( c );
                }
            }
        );
 
    return  stack.size();
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    const   int     RAND_BRACKETS_SEQ_LEN   =   10;
 
    for(;;)
    {
        T_str   rand_brackets_sequence      =   get_rand_brackets_sequence_with_len( RAND_BRACKETS_SEQ_LEN );
 
        std::cout   <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  "В последовательности скобок"
                    <<  std::endl
                    <<  rand_brackets_sequence
                    <<  std::endl
                    <<  "нужно убрать "
                    <<  count_extra_brackets( rand_brackets_sequence )
                    <<  " скобок, чтобы получить корректную последовательность."
                    <<  std::endl;
 
        system("pause");
    }//for
}
1
16.10.2014, 23:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2014, 23:16
Помогаю со студенческими работами здесь

Сколько чисел нужно взять в последовательности 1+2+3+4+…, чтобы получить число, большее чем N?
Сколько чисел нужно взять в последовательности 1+2+3+4+…, чтобы получить число, большее чем N?

Дана последовательность символов. Определить сколько букв латинского алфавита встречается в данной последовательности
Дана последовательность символов. Определить сколько букв латинского алфавита встречается в данной...

Сколько пластин надо собрать, чтобы получить конденсатор данной ёмкости?
Сколько пластин площадью 0,01м^2 надо собрать, чтобы получить конденсатор емкостью 1 мкФ, если в...

Сколько чисел последовательности нужно взять, чтобы их сумма превысила 1000
Сколько чисел последовательности 2, 4, 6, 8, ... нужно взять, чтобы их сумма превысила 1000?...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru