Example #1
0
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);
}