Задача
По числу $x$ определим $p(x)$ как произведение его цифр. Рассмотрим последовательность $x$, $p(x)$, $p(p(x))$… Стойкостью $x$ назовем индекс (начиная с $0$) первого однозначного числа в этой последовательности. Например, из $99$ получим последовательность $99$, $9 · 9 = 81$, $8 · 1 = 8$. Стойкость числа $99$ равна $2$. По заданному числу $n$ определите его стойкость.
Входные данные
Каждая строка содержит одно целое число $n (0 \leqslant n \leqslant 2 · 10^9)$.
Выходные данные
Для каждого значения $n$ выведите в отдельной строке его стойкость.
Решение
Опишем функцию $p(x)$, которая будет считать произведение цифр числа $x$. Для этого в функции заводим дополнительную переменную, например, $t$, равную единице, которую будем циклично домножать на остаток от деления $x$ на $10$, а $x$ уменьшать на разряд до тех пор, пока $x$ не попадёт в разряд единиц. Получившееся значение $t$ снова передаём в функцию $p(x)$ в качестве аргумента. Продолжим действия, описанные выше, до тех пор пока значение $t$ не будет находиться в разряде единиц. Индекс последней итерации функции и будет искомой стойкостью числа $x$.
Тесты
№ | Ввод | Вывод |
---|---|---|
1 | 99 268 6 |
2 4 0 |
2 | 796 1 100 |
5 0 1 |
3 | 2356951 53 9892 |
2 2 3 |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> using namespace std; int p(int x) { int t = 1; while (x != 0) { t *= x % 10; x = x / 10; } return t; } int main() { int x; while (cin >> x) { int i = 0; while (x / 10 != 0) { x = p(x); i++; } cout << i << endl; } return 0; } |
Код для считывания строками
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 |
#include <iostream> #include <string> using namespace std; string f(string x) { int mult = 1; for (int i = 0; i < x.length(); i++) { mult *= int(x.at(i)) - int('0'); } string result = to_string(mult); return result; } int main() { string inp; while (cin >> inp) { int count = 0; while (inp.length() > 1) { inp = f(inp); count++; } cout << count << endl; } return 0; } |
Код c-string
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 |
#include <iostream> #include <cstring> using namespace std; int f(char* str, int i) { if (i == 0) return int(str[i]) - int('0'); else return (int(str[i]) - int('0')) * f(str, i - 1); } int main() { char str[10]; int t; while (cin >> str) { int count = 0; while (strlen(str) > 1) { int k = strlen(str) - 1; t = f(str, k); memset(str, 0, sizeof(str) / sizeof(str[0])); sprintf(str, "%d", t); count++; } cout << count << endl; } return 0; } |
Ссылки
- Условие задачи
- Решение
- Результаты тестирования
- Решение для работы со строками
- Результаты тестирования работы со строками
- Решения для c-string
- Результаты тестирования c-string
Хорошо. Только обновите ссылки на код и решение. И отформатируйте название как у всех.
Дал эту же задачу, как упражнение на строки. Попробуйте дополнить вариантами решения, которые будут работать не с числом, а с его десятичным представлением в виде строки.
Решение дополнил
Код упростил, как Вы просили.
И отформатируйте название как у всех.