Я не думаю, что это работает. Если я добавлю вход 11 в вашу функцию, я думаю, что получу 45 + 0 + 2 + 1, где я ожидаю 2. Я бы ожидал что-то вроде этого грубого усилия:
unsigned long long sum_digits(unsigned long long N) {
size_t exp = std::log10(N);
unsigned long long result = 0u;
for (size_t i = 0u; i <= exp; ++i) {
//isolate the (i+1)th digit
long long ub = std::pow(10, i+1);
long long lb = std::pow(10, i);
size_t digit = (N % ub) / lb;
//add the digit's contribution to the sum
result += digit * (digit + 1) / 2;
}
return result;
}
Я бы ожидал суммуцифр, чтобы выглядеть больше так, но я могу просто неправильно понять цель этого алгоритма.