Зацикливание цифр только один раз на вызове superDigit
и избежание рекурсии должно сделать это быстрее. Как то так:
long long superDigit(long long m) {
long long sum;
while(true) {
sum = 0;
while(m != 0) {
sum += m % 10;
m /= 10;
}
if(sum >= 10)
m = sum;
else
break;
}
return sum;
}
Если вам нужна поддержка повторяющихся последовательностей, например, 593 в 10 раз (что обычно слишком велико для long long
), вы можете добавить обертку следующим образом:
long long superDigit(long long m, int times) {
long long r = superDigit(m) * times;
if(r >= 10) r = superDigit(r);
return r;
}
Если числа достаточно малы, чтобы поместиться в long long
, вы можете проверить, работает ли он. Пример:
superDigit(148148148) == superDigit(148, 3)
Если вам нужна поддержка больших чисел, которые являются , а не повторяющимися последовательностями, вы можете добавить еще одну перегрузку, принимая число за std::string
:
long long superDigit(const std::string& m) {
long long sum = 0;
for(auto d : m) sum += d - '0';
if(sum >= 10) return superDigit(sum);
return sum;
}
И вы можете проверить, что он также получает тот же результат, что и одна из предыдущих перегрузок:
superDigit(593, 10) == superDigit("593593593593593593593593593593")