Self Descriptive Number

• Difficulty Level : Easy
• Last Updated : 14 Jan, 2022

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.

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]

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 Codeint main(){    for (int i = 0; i < 100000000; i++)        if (isSelfDescriptiveNumber(i))            cout << i << endl;} // This code is contributed by// Manish Shaw(manishshaw1)

Java

 // 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)    {        for (int i = 0; i < 100000000; i++)            if (isSelfDescriptiveNumber(i))                System.out.println(i);           }}

Python3

 # 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__":         for i in range(100000000):        if (isSelfDescriptiveNumber(i)):            print(i) # This code is contributed by rutvik_56

C#

 // 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 Codestatic void Main(){    for (int i = 0; i < 100000000; i++)        if (isSelfDescriptiveNumber(i))            Console.WriteLine(i);   }}  // This code is contributed by// Manish Shaw(manishshaw1)

PHP



Above program takes O( n*len(n)*len(n) ) time which 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

Output:

0

1210

2020

21200

3211000

42101000

Time Complexity: O( n*len(n) )

Auxiliary Space: O(1)

My Personal Notes arrow_drop_up