С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256

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

05.08.2015, 20:40. Показов 5735. Ответов 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)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.08.2015, 20:40
Ответы с готовыми решениями:

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

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

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

17
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
05.08.2015, 21:07
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
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
05.08.2015, 23:41  [ТС]
Цитата Сообщение от tnk500 Посмотреть сообщение
Melvil, легко же.
Дело в том, что это решение неверно. Вы не учитываете возможность ввода нуля, а после него символов, как сказано в условии, вообще зачем здесь cin.ignore() ?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.08.2015, 23:55
Melvil, так после 0,все символы должны игнорироваться,в чем проблема?
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
06.08.2015, 00:36  [ТС]
Цитата Сообщение от 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
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
06.08.2015, 00:43
Цитата Сообщение от Melvil Посмотреть сообщение
Именно этого я и не увидел в предыдущем коде. Решение:
понимаете,здесь принято помогать,а не делать всю работу за вас. В исходном посте вы не акцентировали внимание на конкретной проблеме,так что tnk500 справедливо привел код для одной из подзадач.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
06.08.2015, 09:24
Melvil, интересно, что вы забыли в программировании на С++, если не можете заменить шестую строку определением вектора и циклом с поэлементным вводом?

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

вообще зачем здесь cin.ignore()
Чтобы консолька не обижалась и не уходила от нас так быстро, что прочесть данные в ней не удавалось
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
06.08.2015, 09:40
Цитата Сообщение от tnk500 Посмотреть сообщение
Чтобы консолька не обижалась и не уходила от нас так быстро, что прочесть данные в ней не удавалось
Вы наверное с std::cin.get() перепутали.
0
3 / 3 / 5
Регистрация: 20.05.2014
Сообщений: 12
06.08.2015, 09:53
Лучший ответ Сообщение было отмечено 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
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
06.08.2015, 10:32
Цитата Сообщение от 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
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
06.08.2015, 10:51
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
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
06.08.2015, 11:07  [ТС]
Цитата Сообщение от tnk500 Посмотреть сообщение
интересно, что вы забыли в программировании на С++
Вы так обращаетесь ко всем новичкам в программировании? Возможно, лучше было бы объяснить?

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

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

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

Цитата Сообщение от Melvil Посмотреть сообщение
Если бы я знал сами тесты
Ну вы б тогда обмолвились чтоль парой слов что это за тесты, откуда вы их берете. И зачем.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
06.08.2015, 11:29
Цитата Сообщение от Melvil Посмотреть сообщение
C++
1
std::cin.ignore();
это не ввод, а исключение символа из потока ввода (в данном случае символа новой строки).
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
06.08.2015, 13:06
S_el, нет, не перепутал. Впрочем, они обе задерживают консоль.

Цитата Сообщение от Melvil Посмотреть сообщение
Вы так обращаетесь ко всем новичкам в программировании? Возможно, лучше было бы объяснить?
Простите, раз мои объяснения в том сообщении за объяснения не приняты. Я крепко перед вами виноват. Но совет один дам: в программировании часто имеется решение какой-то общей проблемы, и если частного решения нет - придется самому его описывать. Вам часто придется прибегать к методу научного тыка. Если непонятна функция - тот же cin.ignore(), - удалите строку и посмотрите, что будет. К тому же гугл в этой стране пока не запретили.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
06.08.2015, 14:19
Цитата Сообщение от tnk500 Посмотреть сообщение
нет, не перепутал. Впрочем, они обе задерживают консоль.
нет.Смотрите выше:
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
это не ввод, а исключение символа из потока ввода
подробнее:
http://www.cplusplus.com/refer... am/ignore/
2
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
06.08.2015, 15:11
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
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
06.08.2015, 15:21  [ТС]
Всем большое спасибо, разобрался с cin.ignore().
SatanaXIII, Решаю задачи из курса по C++ на одном сайте. Первые два теста даны, остальные неизвестны. Нужно написать программу, скопировать код на сайт и запустить её - она выведет либо Compilation Error, если что-то не так, либо Wrong Answer и номер теста. Остальные тесты неизвестны по той причине, что многие просто могли бы на каждый тест вывести ответ с помощью цикла for и cout.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.08.2015, 15:21
Помогаю со студенческими работами здесь

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

Определить какое наибольшее число подряд идущих купе полностью свободны
В плацкартном вагоне 54 места, пронумерованных числами от 1 до 54. Вагон разбит на 9 купе. Первые 36 мест расположены по левую сторону от...

Определить наибольшее число идущих подряд положительных элементов в массиве
1)Дан массив A из N элементов. Определить наибольшее число идущих подряд положительных элементов в этом массиве. 2)Подсчитать количество...

Определить наибольшее число идущих подряд одинаковых элементов в массиве
Помогите изменить программу. Дана: Определить наибольшее число идущих подряд положительных элементов в массиве А. Необходимо: Дан...

Подсчитать наибольшее число букв «а» идущих подряд в данной последовательности
Решите пожалуйста эти задачи . Очень нужны. 1. Дана последовательность из n символов. Известно, что в последовательности имеется хотя бы...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru