Self Descriptive Number

17 Jun, 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 = 10000Output: 1210 2020Explanation: From 1 to N only these two numbers are the self-descriptive numbers
Input: N = 10Output: 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++
Java
Python3
C#
PHP
Javascript
// C++ program to print// all self descriptive// number below 100000000#include <iostream>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 Codeint 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 program to print all self descriptive// number below 100000000public 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 program to print# all self descriptive# number below 100000000def 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 codeif __name__=="__main__":    N = 1000000    for i in range(1, N+1):        if (isSelfDescriptiveNumber(i)):            print(i) # This code is contributed by rutvik_56
// C# program to print// all self descriptive// number below 100000000using 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// PHP program to print// all self descriptive// number below 100000000 // Note:// 100000000 is a huge no so// it give sometime TLE error// because its takes compile// time above 5 secfunction isSelfDescriptiveNumber($num){    // converting the integer    // num to string    $s = strval($num);    for ($i = 0; $i < strlen($s); $i++)    {         // 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 = $temp_char - '0';         // counting how many        // times the particular        // digit occur in the        // whole number "num"        $count = 0;        for ($j = 0; $j < strlen($s); $j++)        {            // converting string            // char to integer            $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$N = 1000000;for ($i = 0; $i <= $N; $i++)    if (isSelfDescriptiveNumber($i))        echo $i."\n";         // This code is contributed// by mits?>
// 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 Codelet N = 1000000;for (let i = 1; i <= N; i++)    if (isSelfDescriptiveNumber(i))        console.log(i); // This code is contributed by Nidhi goel
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 <bits/stdc++.h>using namespace std; bool isSelfDescriptiveNumber(int num){    string str=to_string(num);         int i;         int freq[10]={0};         while(num>0)    {        freq[num%10]++;        num/=10;    }         for(i=0;i<str.length();i++)        if(freq[i]!=str[i]-'0')        return 0;             return 1;} int main(){    int N = 1000000;    for (int i = 1; i <= N; i++)        if (isSelfDescriptiveNumber(i))            cout << i << endl;    return 0;}
1210
2020
21200
Time Complexity: O( N*len(N) )Auxiliary Space: O(1) 
manishshaw1
Mithun Kumar
sanskar27jain
rutvik_56
prophet1999
animeshdey
classroompxico
number-digits
series
Mathematical
Mathematical
series
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.