Я предполагаю, что это школьное задание, поэтому здесь необходимо использовать рекурсию.В любом случае, вот рекурсивное решение:
Обозначим через f (d, n) число 5 и 8 в первых n цифрах строки цифр d.Тогда мы можем сформировать следующее рекурсивное отношение:
f (d, n) = 1 + f (d, n - 1), если n-ая цифра равна 5 или 8
f (d, n) = f (d, n - 1), если n-ая цифра не является ни 5, ни 8
, а наш базовый случай равен f (d, 0) = 0, поскольку строка размера 0 будетне имеют ни 5, ни 8с
#include <iostream>
#include <string>
int countAndReplace(std::string& digits, int n)
{
if(n == 0)
{
return 0;
}
bool addOne = (digits[n - 1] == '5' || digits[n - 1] == '8');
if(digits[n - 1] % 2 == 0)
{
digits[n - 1] = '0';
}
return addOne + countAndReplace(digits, n - 1);
}
int main()
{
std::string digits;
std::cin >> digits;
std::cout << countAndReplace(digits, digits.size()) << '\n';
std::cout << digits << '\n';
return 0;
}
Сначала нам нужно прочитать цифры из стандартного ввода, для которого лучше всего использовать std :: string, так как мы не знаем количество цифр заранее.Затем мы вызываем нашу рекурсивную функцию, которая принимает два аргумента - ссылку на строку цифр (используется для изменения цифр на месте, для второй части задачи) и длину указанной строки.В функции для каждой цифры мы также проверяем, нужно ли ее заменять в соответствии с опубликованными вами правилами, и если она это делает, мы делаем замену на месте, поэтому в качестве аргумента используется ссылка на строку.
Это очень простая проблема.Пожалуйста, в следующий раз, попробуйте решить свои задачи самостоятельно, прежде чем обращаться за помощью.В противном случае у вас будут проблемы с прогрессом.