Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

Find all Autobiographical Numbers with given number of digits

  • Difficulty Level : Medium
  • Last Updated : 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. 
 

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

Examples: 
 

Input: N = 4 
Output: 1210, 2020
Input: 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. 
 

  1. Convert the number to a string
  2. iterate through each digit and store it in a variable.
  3. 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.
  4. 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++




// 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 not
bool 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 digits
void 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 Code
int main()
{
 
    int N = 0;
    findAutoBios(N);
 
    N = 4;
    findAutoBios(N);
 
    return 0;
}

Java




// 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);
    }
}

Python3




# Python implementation to find
# Autobiographical numbers with length N
 
from math import pow
 
# Function to return if the
# number is autobiographical or not
def 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 digits
def 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 Code
if __name__ == "__main__":
 
    N = 0
    findAutoBios(N)
 
    N = 4
    findAutoBios(N)

C#




// C# implementation to find
// Autobiographical numbers with length N
using 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
Output: 
There is no Autobiographical number with 0 digits
1210, 2020

 

Time Complexity: O(10n – 10n-1)

Auxiliary Space: O(1)




My Personal Notes arrow_drop_up
Recommended Articles
Page :