Решаю задачу по информатике :
Преподаватель по программированию некоего Центра для одаренных детей, узнав, что его ученики знают математику 3-го класса на 97.001 процентов, решил проверить их знания по курсу математики 1-го класса. Для этого он взял за основу популярнейшую у математиков 1-го класса задачу.
Первоклассник должен был продолжить следующую последовательность рядов:
1
11
21
1211
111221
312211
13112221
Входные данные
В единственной строке входного файла записаны два целых числа через пробел: x(0<=x<=100) - первый член последовательности и n(1<=n<=25).
Выходные данные
Выведите n-ый ряд x-ой последовательности
Примеры
входные данные
1 4
выходные данные
1211
Либо по этой ссылке : https://informatics.msk.ru/mod/statements/view3.php?id=248&chapterid=2796#1
Идея какова: В первой строке число 1 встречается 1 раз. Сначала выводим во вторую строку счетчик, потом число. Во второй получившийся строке число 1 всетрчается 2 раза, поэтому 21. В этой строке число 2 встречается 1 раз и число 1 встречается 1 раз, поэтому 1211. И так далее
Важно, что счетчик считает количество цифр подряд. То есть после 1211 будет
111221 (один раз 1, один раз 2, два раза 2), но не 3112(три раза 1, один раз 2)
Собственно, говоря, мой код:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
stringstream container;
string s[25], c;
int n, counter = 1, i, a;
string counter_s;
string return_next_string()
{ //ФУНКЦИЯ ВЫВОДИТ
container.clear(); //СНАЧАЛА СЧЕТЧИК
container << counter; //А ПОТОМ ЧИСЛО
container >> counter_s; //СЧЕТЧИК УКАЗЫВАЕТ СКОЛЬКО РАЗ ПОДРЯД ВСТРЕТИЛОСЬ ЧИСЛО
s[a+1] = s[a+1] + counter_s + c[i]; //И ТАКИМ ОБРАЗОМ ВВОДИТСЯ СЛЕДУЮЩАЯ СТРОКА
counter = 1;
return s[a+1];
}
int main()
{
cin >> s[0] >> n; //ВВОД САМОЙ ПЕРВОЙ СТРОКИ И ЧИСЛА НУЖНОЙ НАМ СТРОКИ
for ( a = 0; a < n; a++) //ПЕРЕБОР СТРОК С 1 ДО НУЖНОЙ
{
c = s[a];
i = 0;
while (i < s[a].size()) //ПЕРЕБОР КАЖДОЙ ЦИФРЫ В СТРОКЕ
{
if (i == s[a].size() - 1) //ЕСЛИ ЦИФРА ПОСЛЕДНЯЯ
return_next_string();
else if (c[i] == c[i + 1] ) //ЕСЛИ ЦИФРА РАВНА СЛЕДУЮЩЕЙ
counter++; //УВЕЛИЧИВАЕМ СЧЕТЧИК
else //ЕСЛИ ЦИФРА НЕ РАВНА СЛЕДУЮЩЕЙ, ТО ВХОДИМ В return_next
return_next_string(); //и узнаем, сколько раз она была равна
i++;
}
}
cout << s[n-1] << endl;
system("pause");
return 0;
}
В чем проблема: Из всех 20 тестов не проходят 2. Причина : ошибка выполнения программы. Какое исключение не обработано, что вызывает ошибку - не могу понять с начала недели. Сдался)
Что то мне стало стыдно). Если n максимальное = 25, то a = 24, а s[a+1] выходит за рамки массива. Изменил массив с s[25] на s[26] и все получилось. Я думал, что если a максимум 24, то максимум s[25], а ведь я создал string s[25], почему же он не входил? ДУмал, что при объявлении s[25] создаются массивы с 0 до 25, а не 25 массивов с 0 до 24.
Программа работает, но в конце выдает эту ошибку:
Задача популярнаяПросто нужно сделать бинарное возведение в степень по модулю
Создал я программу вывода меню, ну и выполнения действий по пунктам меню:
Есть бинарный файлНужно сделать проверку на пустоту, и если false, то очистить его