 Open in App
Not now

# Self Descriptive Number

• Difficulty Level : Easy
• Last Updated : 04 Aug, 2022

Given an integer N, the task is to find all the self-descriptive numbers from 1 to N

A self-descriptive number is an integer n in given base b is b digits long in which each digit at position p (the most significant digit being at position 0 and the least significant at position b – 1) counts how many times a digit p is in n

For example in base 10, 6210001000 is a self descriptive number as there are six 0s, two 1s, one 2 and one 6.
Explanation :
It is 10 digit number in base 10.
It has 6 at the position 0 and there are six 0s in 6210001000.
It has 2 at the position 1 and there are two 1s in 6210001000.
It has 1 at the position 2 and there is one 2s in 6210001000.
It has 0 at the position 3 and there are zero 3s in 6210001000.
It has 0 at the position 4 and there are zero 4s in 6210001000.
It has 0 at the position 5 and there are zero 5s in 6210001000.
It has 1 at the position 6 and there is one 6 in 6210001000.
It has 0 at the position 7 and there are zero 7s in 6210001000.
It has 0 at the position 8 and there are zero 8s in 6210001000.
It has 0 at the position 9 and there are zero 9s in 6210001000.
[Source : Wikipedia]

Examples:

Input: N = 10000
Output: 1210 2020
Explanation: From 1 to N only these two numbers are the self-descriptive numbers

Input: N = 10
Output:
Explanation: There is no self descriptive number in range [1, 10]

Here is a program to print all self-descriptive numbers below 100000000. In the below program we have just ignored one fact about the self-descriptive number that it should have as many number of digits as much the base is given.

Description of Program :
1 . Firstly all the digits get extracted from the outer loop and are stored in a variable b in each iteration.
2 . Then in the inner loop there is a count on how many times number i (this i is ith index of outer loop) is present in the string.
3 . Finally that count is compared with the digit present at the ith index stored in variable b.

## C++

 `// C++ program to print``// all self descriptive``// number below 100000000``#include ``using` `namespace` `std;` `bool` `isSelfDescriptiveNumber(``int` `num)``{``    ``// converting the integer``    ``// num to string``    ``string s = to_string(num);``    ``for` `(``int` `i = 0;``             ``i < s.size(); i++)``    ``{` `        ``// Extracting each digit``        ``// one by one from the``        ``// string``        ``char` `temp_char = s.at(i);` `        ``// converting the string``        ``// (digit) into integer b``        ``// variable stores the digit``        ``// present at index 'i'``        ``int` `b = temp_char - ``'0'``;` `        ``// counting how many``        ``// times the particular``        ``// digit occur in the``        ``// whole number "num"``        ``int` `count = 0;``        ``for` `(``int` `j = 0;``                 ``j < s.size(); j++)``        ``{``            ``// converting string``            ``// char to integer``            ``int` `temp = s.at(j) - ``'0'``;` `            ``// checking whether it is``            ``// equal to the index 'i'``            ``// if it is then increment``            ``// the count .``            ``if` `(temp == i)``            ``{``                ``count++;``            ``}``        ``}``        ` `        ``// If it is not equal``        ``// it return false .``        ``if` `(count != b)``            ``return` `false``;``    ``}``    ``return` `true``;``}` `// Driver Code``int` `main()``{``    ``int` `N = 1000000;``    ``for` `(``int` `i = 1; i <= N; i++)``        ``if` `(isSelfDescriptiveNumber(i))``            ``cout << i << endl;``    ``return` `0;``}` `// This code is contributed by``// Manish Shaw(manishshaw1)`

## Java

 `// Java program to print all self descriptive``// number below 100000000``public` `class` `SelfDescriptive {` `    ``public` `static` `boolean` `isSelfDescriptiveNumber(``int` `num)``    ``{``        ``// converting the integer num to string``        ``String s = Integer.toString(num);``        ``for` `(``int` `i = ``0``; i < s.length(); i++) {` `            ``// Extracting each digit one by one from the string``            ``String temp_char = s.charAt(i) + ``""``;` `            ``// converting the string (digit) into integer``            ``// b variable stores the digit present at index 'i'``            ``int` `b = Integer.parseInt(temp_char);` `            ``// counting how many times the particular digit``            ``// occur in the whole number "num"``            ``int` `count = ``0``;``            ``for` `(``int` `j = ``0``; j < s.length(); j++) {``                ``// converting string char to integer``                ``int` `temp = Integer.parseInt(s.charAt(j) + ``""``);` `                ``// checking whether it is equal to the index 'i'``                ``// if it is then increment the count .``                ``if` `(temp == i) {``                    ``count++;``                ``}``            ``}` `            ``// If it is not equal``            ``// it return false .``            ``if` `(count != b)``                ``return` `false``;``        ``}``        ``return` `true``;``    ``}` `    ``public` `static` `void` `main(String[] args)``    ``{``        ``int` `N = ``1000000``;``        ``for` `(``int` `i = ``1``; i <= N; i++)``            ``if` `(isSelfDescriptiveNumber(i))``                ``System.out.println(i);       ``    ``}``}`

## Python3

 `# Python3 program to print``# all self descriptive``# number below 100000000``def` `isSelfDescriptiveNumber(num):` `    ``# Converting the integer``    ``# num to string``    ``s ``=` `str``(num)``    ` `    ``for` `i ``in` `range``(``len``(s)):`` ` `        ``# Extracting each digit``        ``# one by one from the``        ``# string``        ``temp_char ``=` `s[i]`` ` `        ``# Converting the string``        ``# (digit) into integer b``        ``# variable stores the digit``        ``# present at index 'i'``        ``b ``=` `ord``(temp_char) ``-` `ord``(``'0'``)`` ` `        ``# Counting how many``        ``# times the particular``        ``# digit occur in the``        ``# whole number "num"``        ``count ``=` `0``        ` `        ``for` `j ``in` `range``(``len``(s)):``            ` `            ``# Converting string``            ``# char to integer``            ``temp ``=` `ord``(s[j]) ``-` `ord``(``'0'``)`` ` `            ``# Checking whether it is``            ``# equal to the index 'i'``            ``# if it is then increment``            ``# the count .``            ``if` `(temp ``=``=` `i):``                ``count ``+``=` `1``                ` `        ``# If it is not equal``        ``# it return false .``        ``if` `(count !``=` `b):``            ``return` `False``    ` `    ``return` `True` `# Driver code``if` `__name__``=``=``"__main__"``:``    ``N ``=` `1000000``    ``for` `i ``in` `range``(``1``, N``+``1``):``        ``if` `(isSelfDescriptiveNumber(i)):``            ``print``(i)` `# This code is contributed by rutvik_56`

## C#

 `// C# program to print``// all self descriptive``// number below 100000000``using` `System;` `class` `GFG {``    ``static` `bool` `isSelfDescriptiveNumber(``int` `num)``    ``{``        ``// converting the integer``        ``// num to string``        ``string` `s = num.ToString();``        ``for` `(``int` `i = 0; i < s.Length; i++) {` `            ``// Extracting each digit``            ``// one by one from the``            ``// string``            ``string` `temp_char = s[i] + ``""``;` `            ``// converting the string``            ``// (digit) into integer b``            ``// variable stores the digit``            ``// present at index 'i'``            ``int` `b = ``int``.Parse(temp_char);` `            ``// counting how many``            ``// times the particular``            ``// digit occur in the``            ``// whole number "num"``            ``int` `count = 0;``            ``for` `(``int` `j = 0; j < s.Length; j++) {``                ``// converting string``                ``// char to integer``                ``int` `temp = ``int``.Parse(s[j] + ``""``);` `                ``// checking whether it is``                ``// equal to the index 'i'``                ``// if it is then increment``                ``// the count .``                ``if` `(temp == i) {``                    ``count++;``                ``}``            ``}` `            ``// If it is not equal``            ``// it return false .``            ``if` `(count != b)``                ``return` `false``;``        ``}``        ``return` `true``;``    ``}` `    ``// Driver Code``    ``static` `void` `Main()``    ``{``        ``int` `N = 1000000;``        ``for` `(``int` `i = 0; i < N; i++)``            ``if` `(isSelfDescriptiveNumber(i))``                ``Console.WriteLine(i);``    ``}``}` `// This code is contributed by``// Manish Shaw(manishshaw1)`

## PHP

 ``

## Javascript

 `// JavaScript program to print``// all self descriptive``// number below 100000000` `function` `isSelfDescriptiveNumber(num)``{``    ``// converting the integer``    ``// num to string``    ``let s = num.toString();``    ``for` `(let i = 0;``             ``i < s.length; i++)``    ``{` `        ``// Extracting each digit``        ``// one by one from the``        ``// string``        ``let temp_char = s[i];` `        ``// converting the string``        ``// (digit) into integer b``        ``// variable stores the digit``        ``// present at index 'i'``        ``let b = temp_char - ``'0'``;` `        ``// counting how many``        ``// times the particular``        ``// digit occur in the``        ``// whole number "num"``        ``let count = 0;``        ``for` `(let j = 0; j < s.length; j++)``        ``{``            ``// converting string``            ``// char to integer``            ``let temp = s[j] - ``'0'``;` `            ``// checking whether it is``            ``// equal to the index 'i'``            ``// if it is then increment``            ``// the count .``            ``if` `(temp == i)``            ``{``                ``count++;``            ``}``        ``}``        ` `        ``// If it is not equal``        ``// it return false .``        ``if` `(count != b)``            ``return` `false``;``    ``}``    ``return` `true``;``}` `// Driver Code``let N = 1000000;``for` `(let i = 1; i <= N; i++)``    ``if` `(isSelfDescriptiveNumber(i))``        ``console.log(i);` `// This code is contributed by Nidhi goel`

Output

```1210
2020
21200```

Time Complexity: O( N*len(N)*len(N) )
Auxiliary Space: O(1)

Efficient Approach: The time in above approach can be reduced by storing frequency of each digit in a 10 length array and then checking it consecutively with the corresponding digit.

## C++14

 `#include ``using` `namespace` `std;` `bool` `isSelfDescriptiveNumber(``int` `num)``{``    ``string str=to_string(num);``    ` `    ``int` `i;``    ` `    ``int` `freq={0};``    ` `    ``while``(num>0)``    ``{``        ``freq[num%10]++;``        ``num/=10;``    ``}``    ` `    ``for``(i=0;i

## Java

 `// Java code to implement the approach``import` `java.util.*;` `class` `GFG {``  ``static` `boolean` `isSelfDescriptiveNumber(``int` `num)``  ``{``    ``String str = String.valueOf(num);``    ``int` `i;``    ``int``[] freq = ``new` `int``[``10``];``    ``for` `(i = ``0``; i < ``10``; i++)``      ``freq[i] = ``0``;` `    ``while` `(num > ``0``) {``      ``freq[num % ``10``]++;``      ``num /= ``10``;``    ``}` `    ``for` `(i = ``0``; i < str.length(); i++)``      ``if` `(freq[i] != str.charAt(i) - ``'0'``)``        ``return` `false``;` `    ``return` `true``;``  ``}` `  ``public` `static` `void` `main(String[] args)``  ``{``    ``int` `N = ``1000000``;``    ``for` `(``int` `i = ``1``; i <= N; i++)``      ``if` `(isSelfDescriptiveNumber(i))``        ``System.out.println(i);``  ``}``}` `// This code is contributed by phasing17`

## Python3

 `# Python3 code to implement the approach`  `# Function to check if the number is self descriptive``def` `isSelfDescriptiveNumber(num):` `    ``str_ ``=` `str``(num)` `    ``# A frequency table for all the digits``    ``freq ``=` `[``0` `for` `_ ``in` `range``(``10``)]` `    ``# Building the frequency table for the number``    ``while` `(num > ``0``):``        ``freq[num ``%` `10``] ``+``=` `1``        ``num ``/``/``=` `10` `    ``for` `i ``in` `range``(``len``(str_)):``        ``if` `(freq[i] !``=` `int``(str_[i])):``            ``return` `0` `    ``return` `1`  `# Driver Code``N ``=` `1000000``for` `i ``in` `range``(``1``, ``1` `+` `N):``    ``if` `(isSelfDescriptiveNumber(i)):``        ``print``(i)`  `# This code is contributed by phasing17`

## C#

 `// C# code to implement the approach``using` `System;``using` `System.Collections.Generic;` `class` `GFG {``  ``static` `bool` `isSelfDescriptiveNumber(``int` `num)``  ``{``    ``string` `str = Convert.ToString(num);``    ``int` `i;``    ``int``[] freq = ``new` `int``;``    ``for` `(i = 0; i < 10; i++)``      ``freq[i] = 0;` `    ``while` `(num > 0) {``      ``freq[num % 10]++;``      ``num /= 10;``    ``}` `    ``for` `(i = 0; i < str.Length; i++)``      ``if` `(freq[i] != str[i] - ``'0'``)``        ``return` `false``;` `    ``return` `true``;``  ``}` `  ``public` `static` `void` `Main(``string``[] args)``  ``{``    ``int` `N = 1000000;``    ``for` `(``int` `i = 1; i <= N; i++)``      ``if` `(isSelfDescriptiveNumber(i))``        ``Console.WriteLine(i);``  ``}``}` `// This code is contributed by phasing17`

## Javascript

 `// JavaScript code to implement the approach` `function` `isSelfDescriptiveNumber(num)``{``    ``let str = num.toString();` `    ``let i;` `    ``let freq = ``new` `Array(10).fill(0);` `    ``while` `(num > 0) {``        ``freq[num % 10]++;``        ``num = Math.floor(num / 10);``    ``}` `    ``for` `(i = 0; i < str.length; i++)``        ``if` `(freq[i] != parseInt(str[i]))``            ``return` `0;` `    ``return` `1;``}` `let N = 1000000;``for` `(``var` `i = 1; i <= N; i++)``    ``if` `(isSelfDescriptiveNumber(i))``        ``console.log(i);` `// This code is contributed by phasing17`

Output

```1210
2020
21200```

Time Complexity: O( N*len(N) )
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up