How to check if every digit in a number appears only once in C++

3 Answers

0 votes
#include <iostream>

bool allDigitsUnique(int n) {
    bool seen[10] = {false};

    while (n > 0) {
        int digit = n % 10;
        if (seen[digit]) return false; // digit already appeared
        seen[digit] = true;
        n /= 10;
    }
    
    return true;
}

int main() {
    int n = 123456;
    std::cout << (allDigitsUnique(n) ? "Unique" : "Not unique") << "\n";
    
    n = 123452;
    std::cout << (allDigitsUnique(n) ? "Unique" : "Not unique") << "\n";
}



/*
run:

Unique
Not unique

*/

 



answered Feb 25 by avibootz
0 votes
#include <iostream>

// n % 10 extracts the last digit.
// 1 << digit creates a bitmask for that digit.
// mask & bit checks whether the bit for this digit is already set.
// Mark the digit as seen: mask |= bit; This sets the bit for the current digit.

bool allDigitsUnique(int n) {
    int mask = 0;

    while (n > 0) {
        int digit = n % 10;
        int bit = 1 << digit;

        if (mask & bit) return false; // digit already seen
        mask |= bit;

        n /= 10;
    }

    return true;
}


int main() {
    int n = 123456;
    std::cout << (allDigitsUnique(n) ? "Unique" : "Not unique") << "\n";
    
    n = 123452;
    std::cout << (allDigitsUnique(n) ? "Unique" : "Not unique") << "\n";
}



/*
run:

Unique
Not unique

*/

 



answered Feb 25 by avibootz
edited Feb 25 by avibootz
0 votes
#include <iostream>
#include <string>
#include <set>

bool allDigitsUnique(int n) {
    std::string s = std::to_string(n);
    std::set<char> digits(s.begin(), s.end());
    
    return digits.size() == s.size();
}

int main() {
    int n = 123456;
    std::cout << (allDigitsUnique(n) ? "Unique" : "Not unique") << "\n";
    
    n = 123452;
    std::cout << (allDigitsUnique(n) ? "Unique" : "Not unique") << "\n";
}



/*
run:

Unique
Not unique

*/

 



answered Feb 25 by avibootz
...