Простой алгоритм не работает
Написал решение тривиальной задачки, но она почему-то не работает. Сколько не тестил, всё хорошо, но 40% проверок на сайте не проходит.
Условие: У Витека есть набор кубиков, на котором изображены английские буквы, причём как маленькие, так и большие. Недавно мама подарила ему ещё и набор кубиков с цифрами, в результате чего Витек научился быстро считать в пределах 10-ти. А вот отец имел неосторожность подарить ему набор разноцветных маркеров, после чего Витек начал экспериментировать с кубиками с цифрами: он зарисовывал очередную цифру и на её месте рисовал цифру на единицу большую. Так как он прекрасно понимал, что цифры 10 не существует, он вместо числа 10 всегда писал цифру 0
Учтите, что иногда мама звала Витека покушать и он не успевал завершить начатую работу и написать новую цифру – в этом случае кубик навсегда оставался пустым, такие кубики обозначены символом пробела
Необходимо помочь Витеку и написать программу, которая выполнит очередную маркЕровку кубиков по указанным правилам. Так как Вы находитесь не дома, а на олимпиаде, то мама Вас кушать не позовёт и работу Вам обязательно нужно закончить.
Входные данные
Единственная строка, состоящая из описанных выше символов. Длина строки не превышает 255 символов.
Выходные данные
Единственная строка – результат работы Вашей программы.
Примеры првавильных тестов:
Входные данные #1
abc2345678901ABC
Выходные данные #1
abc1234567890ABC
Входные данные #2
35725yg q69 PD3K65QlO5rGB98A53Y17aUI60Bd74j63xk6
Выходные данные #2
46836yg q70 PD4K76QlO6rGB09A64Y28aUI71Bd85j74xk7
Код:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
getline(cin, str);
for (int i = 0; i < str.length(); i++)
{
if (str[i] >= 48 and str[i] <= 57)
{
if (str[i] == '1' and str[i + 1] == '0')
{
cout << '0';
i += 1;
}
else
{
if (str[i] != '9')
{
str[i] += 1;
cout << str[i];
}
else cout << '0';
}
}
else cout << str[i];
}
}
Ответы (2 шт):
Во-первых, не понятно, как это у автора вообще проходило какие-либо тесты, т.к. ключевого слова and в С++ нет.
Во-вторых, для проверки, является ли символ представлением числа, достаточно использовать встроенную функцию isdigit, а не перебирать коды символов вручную.
В-третьих, как я уже написал в комментарии, у автора довольно странно сделано вот это:
if (str[i] == '1' and str[i + 1] == '0')
{
cout << '0';
i += 1;
}
Не говоря про and, str[i + 1] здесь – потенциальный выход за границы (если i будет равно последнему элементу массива). И сама логика не ясна. Если данное число равно 1, а следующее 0, нужно вывести 0 и пропустить следующее... Но по условию ведь на 0 нужно заменять 9, а не 10. Здесь вообще не бывает 10, здесь есть только 1 и 0.
В-четвёртых, str[i] += 1; возвращает int, а значит cout выводит код каждого символа числами, а не сами символы, а потому нужно преобразовывать коды обратно в символы.
В общем, принимая во внимание вышесказанное, я бы написал так:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
getline(cin, str);
for (int i = 0; i < str.length(); i++)
{
if (isdigit(str[i]))
{
if (str[i] != '9')
{
cout << static_cast<char>(str[i] + 1);
}
else cout << '0';
}
else cout << str[i];
}
}
Еще вариант:
#include <iostream>
#include <string>
int main() {
std::string s;
std::cin >> s;
for (int i = s.length() - 1; i >= 0; --i) {
if (std::isdigit(s[i])) {
++s[i];
if (s[i] == ':') s[i] = '0';
}
}
std::cout << s;
}