Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Melvil
48 / 47 / 26
Регистрация: 20.05.2015
Сообщений: 251
1

Определить какое наибольшее число подряд идущих элементов последовательности равны друг другу

05.08.2015, 20:40. Просмотров 1629. Ответов 17
Метки нет (Все метки)

Добрый вечер, решил задачку, но выдаёт ошибку на пятом тесте. У меня два вопроса: Есть ли более простой способ решения и, собственно, помогите найти ошибку.

Кликните здесь для просмотра всего текста
Дана последовательность натуральных чисел, завершающаяся числом 0. Требуется определить, какое наибольшее число подряд идущих элементов этой последовательности равны друг другу.

Входные данные

Входной файл INPUT.TXT содержит последовательность неотрицательных целых чисел, не превышающих значения 100. Гарантируется, что во входных данных не более 100 чисел и среди них есть хотя бы одно число 0.

Выходные данные

В выходной файл OUTPUT.TXT выведите целое число – ответ на задачу.


Мой вариант:

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
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
    int value;
    int max = -10000;
    int pro = 0;
    int counter = 0;
    vector<int>csave(100);
    string s;
    getline(cin, s); // Сам ввод
    stringstream in(s);
    while (in >> value)
    {
        int i = 0;
        if (value == pro)
        {
            counter += 1;
            csave[i] = counter;
        }
        else if (value == 0)
        {
            break;
        }
        else if (value != pro)
        {
            counter = 0;
            i++;
        }
        pro = value;
    }
    for (int i = 0; i < csave.size(); i++)
    {
        if (csave[i] > max)
            max = csave[i];
    }
    cout << max + 1 << endl;
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2015, 20:40
Ответы с готовыми решениями:

Определить, какое наибольшее число подряд идущих элементов этой последовательности равны друг другу.
Дана последовательность натуральных чисел, завершающаяся числом 0. Определить,...

наибольшее число подряд идущих элементов
Задача вроде не сложная, но что-то не так. :( HELP! Дана последовательность...

Найти в массиве наибольшее число подряд идущих одинаковых элементов
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include &lt;iostream&gt; #include&lt;conio.h&gt;...

Найти в массиве наибольшее число подряд идущих одина*ковых элементов.
Народ надо решить задачку...на простом СИ! Кто поможет буду благодарен... ...

Подсчитать наибольшее количество одинаковых подряд идущих чисел последовательности
Даны целые числа x1, ..., xn. Подсчитать наибольшее количество одинаковых...

17
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
05.08.2015, 21:07 2
Melvil, легко же.
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <vector>
#include <iostream>
 
int main()
{
    std::vector<int> array = { 1, 1, 3, 4, 4, 3, 5, 5, 5, 1, 3 };
 
    int count = 1, max = 1;
    for (int i = 1; i < array.size(); ++i)
        if (array[i - 1] == array[i])
            count++;
        else {
            max = count > max ? count : max;
            count = 1;
        }
    std::cout << max;
 
    std::cin.ignore();
    return 0;
}
0
Melvil
48 / 47 / 26
Регистрация: 20.05.2015
Сообщений: 251
05.08.2015, 23:41  [ТС] 3
Цитата Сообщение от tnk500 Посмотреть сообщение
Melvil, легко же.
Дело в том, что это решение неверно. Вы не учитываете возможность ввода нуля, а после него символов, как сказано в условии, вообще зачем здесь cin.ignore() ?
0
S_el
2151 / 1679 / 353
Регистрация: 15.12.2013
Сообщений: 6,644
05.08.2015, 23:55 4
Melvil, так после 0,все символы должны игнорироваться,в чем проблема?
0
Melvil
48 / 47 / 26
Регистрация: 20.05.2015
Сообщений: 251
06.08.2015, 00:36  [ТС] 5
Цитата Сообщение от S_el Посмотреть сообщение
так после 0,все символы должны игнорироваться,в чем проблема?
Именно этого я и не увидел в предыдущем коде. Решение:

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 <vector>
#include <sstream>
#include <string>
using namespace std;
int main()
{
    vector<int>array;
    int count = 1, max = 1, value;
    string s;
    getline(cin, s); 
    stringstream in(s);
    while (in >> value)
    {
        array.push_back(value);
    }
    for (int i = 1; i < array.size(); ++i)
        if (array[i - 1] == array[i])
        count++;
        else 
        {
            max = count > max ? count : max;
            count = 1;
            if (array[i] == 0)
                break;
        }
        cout << max << endl;
        return 0;
}
0
S_el
2151 / 1679 / 353
Регистрация: 15.12.2013
Сообщений: 6,644
06.08.2015, 00:43 6
Цитата Сообщение от Melvil Посмотреть сообщение
Именно этого я и не увидел в предыдущем коде. Решение:
понимаете,здесь принято помогать,а не делать всю работу за вас. В исходном посте вы не акцентировали внимание на конкретной проблеме,так что tnk500 справедливо привел код для одной из подзадач.
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
06.08.2015, 09:24 7
Melvil, интересно, что вы забыли в программировании на С++, если не можете заменить шестую строку определением вектора и циклом с поэлементным вводом?

Нужна проверка до нуля? for(int i = 1; i < array.size() && array[i - 1]; ++i) ...;

вообще зачем здесь cin.ignore()
Чтобы консолька не обижалась и не уходила от нас так быстро, что прочесть данные в ней не удавалось
0
S_el
2151 / 1679 / 353
Регистрация: 15.12.2013
Сообщений: 6,644
06.08.2015, 09:40 8
Цитата Сообщение от tnk500 Посмотреть сообщение
Чтобы консолька не обижалась и не уходила от нас так быстро, что прочесть данные в ней не удавалось
Вы наверное с std::cin.get() перепутали.
0
Dmitriy_73
3 / 3 / 5
Регистрация: 20.05.2014
Сообщений: 12
Завершенные тесты: 7
06.08.2015, 09:53 9
Лучший ответ Сообщение было отмечено Melvil как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
int main() {
    int a, b = 1, c = 1, max = 1;
    std::cin >> a;
    if (a) {
        while (b) {
            std::cin >> b;
            if (b == a)
                c++;
            else {
                if (c > max)
                    max = c;
                a = b;
                c = 1;
            }
        }
    }
    std::cout << max;
    return 0;
}
2
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
06.08.2015, 10:32 10
Цитата Сообщение от Melvil Посмотреть сообщение
выдаёт ошибку на пятом тесте
Пятый тест это когда насыпается круг солью, в него помещается код, и всю ночь тестируется? Или это шестой?

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
#include <iostream>
#include <algorithm>
#include <vector>
 
static int Counter(0);
void Do( int val )
{
  static int CurrCouter(0),
             CurrElem(val);
  if( CurrElem != val )
    {
    CurrElem = val;
    if( CurrCouter >= Counter )
      {
      Counter = CurrCouter;
      CurrCouter = 1;
      }
    }
  else
    CurrCouter++;
}
 
int main()
{
  #define N 10
  int array[N] = { 4, 6, 6, 6, 8, 8, 0, 0, 6, 6 };
  std::vector<int> v( array, array + N );
 
  std::for_each( v.begin(), v.end(), Do );
 
  std::cout << Counter;
 
  std::cin.ignore();
  return 0;
}
1
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
06.08.2015, 10:51 11
Melvil,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main()
{
    int cur, next, counter = 1, max = 1;
    std::cin >> cur;
    if (cur)
        while (std::cin >> next && next != 0)
            if (cur == next)
                ++counter;
            else
            {
                cur = next;
                max = counter > max ? counter : max;
                counter = 1;
            }
        
    std::cout << max << std::endl;
    
    return 0;
}
Добавлено через 2 минуты

Не по теме:

Dmitriy_73, не буду говорить, у кого мысли сходятся да ещё и практически строчка в строчку :)

1
Melvil
48 / 47 / 26
Регистрация: 20.05.2015
Сообщений: 251
06.08.2015, 11:07  [ТС] 12
Цитата Сообщение от tnk500 Посмотреть сообщение
интересно, что вы забыли в программировании на С++
Вы так обращаетесь ко всем новичкам в программировании? Возможно, лучше было бы объяснить?

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Пятый тест это когда насыпается круг солью, в него помещается код, и всю ночь тестируется?
Если бы я знал сами тесты меня бы здесь не было. Так что скорее всего круг с солью.

И всё же я не понимаю, некоторые решения - зачем выводить Counter и только после этого просить ввод?

C++
1
2
3
std::cout << Counter;
 
  std::cin.ignore();
0
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
06.08.2015, 11:27 13
Цитата Сообщение от Melvil Посмотреть сообщение
я не понимаю, некоторые решения
Это остановка программы, пауза. Чтобы консольное окно не закрылось, дав пользователю время ознакомиться с результатом работы программы.
Аналогов масса (тот же system("pause"), у всех свои плюсы и минусы.

Цитата Сообщение от Melvil Посмотреть сообщение
Если бы я знал сами тесты
Ну вы б тогда обмолвились чтоль парой слов что это за тесты, откуда вы их берете. И зачем.
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
06.08.2015, 11:29 14
Цитата Сообщение от Melvil Посмотреть сообщение
C++
1
std::cin.ignore();
это не ввод, а исключение символа из потока ввода (в данном случае символа новой строки).
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
06.08.2015, 13:06 15
S_el, нет, не перепутал. Впрочем, они обе задерживают консоль.

Цитата Сообщение от Melvil Посмотреть сообщение
Вы так обращаетесь ко всем новичкам в программировании? Возможно, лучше было бы объяснить?
Простите, раз мои объяснения в том сообщении за объяснения не приняты. Я крепко перед вами виноват. Но совет один дам: в программировании часто имеется решение какой-то общей проблемы, и если частного решения нет - придется самому его описывать. Вам часто придется прибегать к методу научного тыка. Если непонятна функция - тот же cin.ignore(), - удалите строку и посмотрите, что будет. К тому же гугл в этой стране пока не запретили.
0
S_el
2151 / 1679 / 353
Регистрация: 15.12.2013
Сообщений: 6,644
06.08.2015, 14:19 16
Цитата Сообщение от tnk500 Посмотреть сообщение
нет, не перепутал. Впрочем, они обе задерживают консоль.
нет.Смотрите выше:
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
это не ввод, а исключение символа из потока ввода
подробнее:
http://www.cplusplus.com/reference/istream/istream/ignore/
2
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
06.08.2015, 15:11 17
S_el, так-то да, лучше cin.get() использовать. Эффект от него просто тот же.
Вот реализация ignore (у меня, во всяком случае) :
Кликните здесь для просмотра всего текста
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
_Myt& __CLR_OR_THIS_CALL ignore(streamsize _Count = 1,
        int_type _Metadelim = _Traits::eof())
        {   // ignore up to _Count characters, discarding delimiter
        ios_base::iostate _State = ios_base::goodbit;
        _Chcount = 0;
        const sentry _Ok(*this, true);
 
        if (_Ok && 0 < _Count)
            {   // state okay, use facet to extract
            _TRY_IO_BEGIN
            for (; ; )
                {   // get a metacharacter if more room in buffer
                int_type _Meta;
                if (_Count != INT_MAX && --_Count < 0)
                    break;  // buffer full, quit
                else if (_Traits::eq_int_type(_Traits::eof(),
                    _Meta = _Myios::rdbuf()->sbumpc()))
                    {   // end of file, quit
                    _State |= ios_base::eofbit;
                    break;
                    }
                else
                    {   // got a character, count it
                    ++_Chcount;
                    if (_Meta == _Metadelim)
                        break;  // got a delimiter, quit
                    }
                }
            _CATCH_IO_END
            }
 
        _Myios::setstate(_State);
        return (*this);
        }


У меня есть предположение, что увеличивая счетчик в ветви else, cin "переходит в ожидание" спецсимвола. Подтверждение тому - вызов std::cin.ignore(3). Только при вводе двух символов (+ любой escape-символ) программа завершается.
1
Melvil
48 / 47 / 26
Регистрация: 20.05.2015
Сообщений: 251
06.08.2015, 15:21  [ТС] 18
Всем большое спасибо, разобрался с cin.ignore().
SatanaXIII, Решаю задачи из курса по C++ на одном сайте. Первые два теста даны, остальные неизвестны. Нужно написать программу, скопировать код на сайт и запустить её - она выведет либо Compilation Error, если что-то не так, либо Wrong Answer и номер теста. Остальные тесты неизвестны по той причине, что многие просто могли бы на каждый тест вывести ответ с помощью цикла for и cout.
1
06.08.2015, 15:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2015, 15:21

Определить максимальное количество подряд идущих положительных элементов последовательности, не прерываемых ни нулями, ни отрицательными элементами
Дана вещественная таблица а,...,а. Определить максимальное количество подряд...

Определить наибольшее количество положительных идущих подряд чисел массива
Дан одномерный массив А, состоящий из N целых чисел. Составить программу,...

Одномерный массив. Определить наибольшее количество подряд идущих нулей
Дан целочисленный массив А. Определить наибольшее количество подряд идущих нулей


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

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