bool next_digit_permutation(uint32_t &number) { if(!number) return false; // no elements if(number < 10) return false; // single element uint32_t pivot = number % 10; uint32_t front = number / 10; uint32_t order = 10; while(pivot <= front%10) { pivot = front%10; front /= 10; order *= 10; if(!front) { // last permutation already number = reverse_digits(number); return false; } } pivot = front%10; uint32_t mid = number - front*order; uint32_t mfront = mid; uint32_t morder = 1; while(mfront%10 <= pivot) { mfront /= 10; morder *= 10; } front = front - pivot + mfront%10; uint32_t back = mid - mfront*morder; mfront = (mfront - mfront%10 + pivot)*morder + back; number = front*order + reverse_digits(mfront); return true; }
constexpr bool is_parindrome(int cand) { return cand == reverse_digits(cand, 0); }
constexpr int reverse_digits(int in, int out) { return (in == 0) ? out : reverse_digits(in / 10, out * 10 + in % 10); }