Hello Everyone,
Given a range, print all numbers having unique digits.
Examples :
Input : 10 20 Output : 10 12 13 14 15 16 17 18 19 20 (Except 11) Input : 1 10 Output : 1 2 3 4 5 6 7 8 9 10
Approach:
As the problem is pretty simple, the only thing to be done is :- 1- Find the digits one by one and keep marking visited digits. 2- If all digits occurs one time only then print that number. 3- Else not.
// C++ implementation to find unique digit
// numbers in a range
#include<bits/stdc++.h>
using
namespace
std;
// Function to print unique digit numbers
// in range from l to r.
void
printUnique(
int
l,
int
r)
{
// Start traversing the numbers
for
(
int
i=l ; i<=r ; i++)
{
int
num = i;
bool
visited[10] = {
false
};
// Find digits and maintain its hash
while
(num)
{
// if a digit occurs more than 1 time
// then break
if
(visited[num % 10])
break
;
visited[num%10] =
true
;
num = num/10;
}
// num will be 0 only when above loop
// doesn't get break that means the
// number is unique so print it.
if
(num == 0)
cout << i <<
" "
;
}
}
// Driver code
int
main()
{
int
l = 1, r = 20;
printUnique(l, r);
return
0;
}
Output :
1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20
Another Approach:
Use set STL in order to check if a number has only unique digits. Then we can compare the size of string s formed from a given number and newly created set. For example, let us consider the number 1987, then we can convert the number into the string,
int
n;
cin>>n;
string s = to_string(n);
After that, initialize a set with the contents of string s.
- C++
set<
int
> uniDigits(s.begin(), s.end());
Then we can compare the size of string s and newly created set uniDigits.
Here is the code for the above approach:
// C++ code for the above approach
#include <bits/stdc++.h>
using
namespace
std;
// Function to print unique
// numbers
void
printUnique(
int
l,
int
r){
// Iterate from l to r
for
(
int
i = l; i <= r; i++) {
// Convert the no. to
// string
string s = to_string(i);
// Convert string to set using stl
set<
int
> uniDigits(s.begin(), s.end());
// Output if condition satisfies
if
(s.size() == uniDigits.size()) {
cout << i <<
" "
;
}
}
}
// Driver Code
int
main()
{
// Input of the lower and
// higher limits
int
l = 1, r = 20;
// Function Call
printUnique(l, r);
return
0;
}
Output
1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20