Find all Autobiographical Numbers with given number of digits - GeeksforGeeks

24 Nov, 2021
Given N as the number of digits, the task is to find all the Autobiographical Numbers whose length is equal to N.  
An autobiographical number is a number such that the first digit of it counts how many zeroes are there in it, the second digit counts how many ones are there and so on. For example, 1210 has 1 zero, 2 ones, 1 two and 0 threes.  
Examples:  
Input: N = 4 Output: 1210, 2020Input: N = 5 Output: 21200  
 
Approach: Any number with N-digits lies in the range [10(n-1), 10n-1]. So, each number in this range is iterated and checked if it is an Autobiographical number or not.  
Convert the number to a stringiterate through each digit and store it in a variable.Then run an inner loop, compare the iterator of the outer loop with each digit of the inner loop and if they are equal then increment the occurrence count of the digit.Then check for equality between occurrence count and the variable in which each digit is stored so that we can know if the current number is autobiographical or not.
Convert the number to a string
iterate through each digit and store it in a variable.
Then run an inner loop, compare the iterator of the outer loop with each digit of the inner loop and if they are equal then increment the occurrence count of the digit.
Then check for equality between occurrence count and the variable in which each digit is stored so that we can know if the current number is autobiographical or not.
Below is the implementation of the above approach: 
C++
Java
Python3
C#
// C++ implementation to find// Autobiographical numbers with length N #include <bits/stdc++.h>using namespace std; // Function to return if the// number is autobiographical or notbool isAutoBio(int num){     string autoStr;     int index, number, i, j, cnt;     // Converting the integer    // number to string    autoStr = to_string(num);     for (int i = 0;         i < autoStr.size();         i++) {         // Extracting each character        // from each index one by one        // and converting into an integer        index = autoStr.at(i) - '0';         // Initialise count as 0        cnt = 0;         for (j = 0; j < autoStr.size(); j++) {             number = autoStr.at(j) - '0';             // Check if it is equal to the            // index i if true then            // increment the count            if (number == i)                 // It is an                // Autobiographical                // number                cnt++;        }         // Return false if the count and        // the index number are not equal        if (index != cnt)             return false;    }     return true;} // Function to print autobiographical number// with given number of digitsvoid findAutoBios(int n){     int high, low, i, flag = 0;     // Left boundary of interval    low = pow(10, n - 1);     // Right boundary of interval    high = pow(10, n) - 1;     for (i = low; i <= high; i++) {        if (isAutoBio(i)) {            flag = 1;            cout << i << ", ";        }    }     // Flag = 0 implies that the number    // is not an autobiographical no.    if (!flag)        cout << "There is no "             << "Autobiographical number"             << " with " << n             << " digits\n";} // Driver Codeint main(){     int N = 0;    findAutoBios(N);     N = 4;    findAutoBios(N);     return 0;}
// Java implementation to find// Autobiographical numbers with length N import java.util.*;import java.lang.Math; public class autobio {    public static boolean isAutoBio(int num)    {        String autoStr;         int index, number, i, j, cnt;         // Converting the integer        // number to string        autoStr = Integer.toString(num);         for (i = 0; i < autoStr.length(); i++) {             // Extracting each character            // from each index one by one            // and converting into an integer            index = Integer.parseInt(autoStr.charAt(i) + "");             // initialize count as 0            cnt = 0;             for (j = 0; j < autoStr.length(); j++) {                number = Integer.parseInt(autoStr.charAt(j) + "");                 // Check if it is equal to the                // index i if true then                // increment the count                if (number == i)                     // It is an                    // Autobiographical                    // number                    cnt++;            }             // Return false if the count and            // the index number are not equal            if (cnt != index)                 return false;        }         return true;    }     // Function to print autobiographical number    // with given number of digits    public static void findAutoBios(double n)    {        // both the boundaries are taken double, so as        // to satisfy Math.pow() function's signature        double high, low;         int i, flag = 0;         // Left boundary of interval        low = Math.pow(10.0, n - 1);         // Right boundary of interval        high = Math.pow(10.0, n) - 1.0;         for (i = (int)low; i <= (int)high; i++)             if (isAutoBio(i)) {                flag = 1;                System.out.print(i + ", ");            }         // Flag = 0 implies that the number        // is not an autobiographical no.        if (flag == 0)             System.out.println("There is no Autobiographical Number"                               + "with " + (int)n + " digits");    }     // Driver Code    public static void main(String[] args)    {        double N = 0;        findAutoBios(N);         N = 4;        findAutoBios(N);    }}
# Python implementation to find# Autobiographical numbers with length N from math import pow # Function to return if the# number is autobiographical or notdef isAutoBio(num):         # Converting the integer    # number to string    autoStr = str(num)     for i in range(0, len(autoStr)):                  # Extracting each character        # from each index one by one        # and converting into an integer        index = int(autoStr[i])         # Initialize count as 0        cnt = 0         for j in range(0, len(autoStr)):                     number = int(autoStr[j])             # Check if it is equal to the            # index i if true then            # increment the count            if number == i:                 # It is an                # Autobiographical                # number                cnt += 1         # Return false if the count and        # the index number are not equal        if cnt != index:             return False         return True # Function to print autobiographical number# with given number of digitsdef findAutoBios(n):     # Left boundary of interval    low = int(pow(10, n-1))     # Right boundary of interval    high = int(pow(10, n) - 1)     flag = 0     for i in range(low, high + 1):        if isAutoBio(i):            flag = 1            print(i, end =', ')     # Flag = 0 implies that the number    # is not an autobiographical no.    if flag == 0:        print("There is no Autobiographical Number with "+ str(n) + " digits") # Driver Codeif __name__ == "__main__":     N = 0    findAutoBios(N)     N = 4    findAutoBios(N)
// C# implementation to find// Autobiographical numbers with length Nusing System;  class autobio {    public static bool isAutoBio(int num)    {        String autoStr;          int index, number, i, j, cnt;          // Converting the integer        // number to string        autoStr = num.ToString();          for (i = 0; i < autoStr.Length; i++) {              // Extracting each character            // from each index one by one            // and converting into an integer            index = Int32.Parse(autoStr[i] + "");              // initialize count as 0            cnt = 0;              for (j = 0; j < autoStr.Length; j++) {                number = Int32.Parse(autoStr[j] + "");                  // Check if it is equal to the                // index i if true then                // increment the count                if (number == i)                      // It is an                    // Autobiographical                    // number                    cnt++;            }              // Return false if the count and            // the index number are not equal            if (cnt != index)                  return false;        }          return true;    }      // Function to print autobiographical number    // with given number of digits    public static void findAutoBios(double n)    {        // both the boundaries are taken double, so as        // to satisfy Math.Pow() function's signature        double high, low;          int i, flag = 0;          // Left boundary of interval        low = Math.Pow(10.0, n - 1);          // Right boundary of interval        high = Math.Pow(10.0, n) - 1.0;          for (i = (int)low; i <= (int)high; i++)              if (isAutoBio(i)) {                flag = 1;                Console.Write(i + ", ");            }          // Flag = 0 implies that the number        // is not an autobiographical no.        if (flag == 0)              Console.WriteLine("There is no Autobiographical Number"                               + "with " + (int)n + " digits");    }      // Driver Code    public static void Main(String[] args)    {        double N = 0;        findAutoBios(N);          N = 4;        findAutoBios(N);    }} // This code is contributed by sapnasingh4991
There is no Autobiographical number with 0 digits
1210, 2020
 
Time Complexity: O(10n – 10n-1)
Auxiliary Space: O(1)
saikiranjagini
sapnasingh4991
souravmahato348
number-digits
Mathematical
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Modulo Operator (%) in C/C++ with Examples
Prime Numbers
Program to find sum of elements in a given array
Program for Decimal to Binary Conversion
Operators in C / C++
Euclidean algorithms (Basic and Extended)
The Knight's tour problem | Backtracking-1
Efficient program to print all prime factors of a given number
Find minimum number of coins that make a given value