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 <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 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
<?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 sec
function 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
// 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
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;
}
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[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[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
Time Complexity: O( N*len(N) )
Auxiliary Space: O(1)
Explore
DSA Fundamentals
Data Structures
Algorithms
Advanced
Interview Preparation
Practice Problem