Self Descriptive Number
Last Updated :
04 Aug, 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 = 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++
#include <iostream>
using namespace std;
bool isSelfDescriptiveNumber( int num)
{
string s = to_string(num);
for ( int i = 0;
i < s.size(); i++)
{
char temp_char = s.at(i);
int b = temp_char - '0' ;
int count = 0;
for ( int j = 0;
j < s.size(); j++)
{
int temp = s.at(j) - '0' ;
if (temp == i)
{
count++;
}
}
if (count != b)
return false ;
}
return true ;
}
int main()
{
int N = 1000000;
for ( int i = 1; i <= N; i++)
if (isSelfDescriptiveNumber(i))
cout << i << endl;
return 0;
}
|
Java
public class SelfDescriptive {
public static boolean isSelfDescriptiveNumber( int num)
{
String s = Integer.toString(num);
for ( int i = 0 ; i < s.length(); i++) {
String temp_char = s.charAt(i) + "" ;
int b = Integer.parseInt(temp_char);
int count = 0 ;
for ( int j = 0 ; j < s.length(); j++) {
int temp = Integer.parseInt(s.charAt(j) + "" );
if (temp == i) {
count++;
}
}
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
def isSelfDescriptiveNumber(num):
s = str (num)
for i in range ( len (s)):
temp_char = s[i]
b = ord (temp_char) - ord ( '0' )
count = 0
for j in range ( len (s)):
temp = ord (s[j]) - ord ( '0' )
if (temp = = i):
count + = 1
if (count ! = b):
return False
return True
if __name__ = = "__main__" :
N = 1000000
for i in range ( 1 , N + 1 ):
if (isSelfDescriptiveNumber(i)):
print (i)
|
C#
using System;
class GFG {
static bool isSelfDescriptiveNumber( int num)
{
string s = num.ToString();
for ( int i = 0; i < s.Length; i++) {
string temp_char = s[i] + "" ;
int b = int .Parse(temp_char);
int count = 0;
for ( int j = 0; j < s.Length; j++) {
int temp = int .Parse(s[j] + "" );
if (temp == i) {
count++;
}
}
if (count != b)
return false ;
}
return true ;
}
static void Main()
{
int N = 1000000;
for ( int i = 0; i < N; i++)
if (isSelfDescriptiveNumber(i))
Console.WriteLine(i);
}
}
|
PHP
<?php
function isSelfDescriptiveNumber( $num )
{
$s = strval ( $num );
for ( $i = 0; $i < strlen ( $s ); $i ++)
{
$temp_char = $s [ $i ];
$b = $temp_char - '0' ;
$count = 0;
for ( $j = 0; $j < strlen ( $s ); $j ++)
{
$temp = $s [ $j ] - '0' ;
if ( $temp == $i )
{
$count ++;
}
}
if ( $count != $b )
return false;
}
return true;
}
$N = 1000000;
for ( $i = 0; $i <= $N ; $i ++)
if (isSelfDescriptiveNumber( $i ))
echo $i . "\n" ;
?>
|
Javascript
function isSelfDescriptiveNumber(num)
{
let s = num.toString();
for (let i = 0;
i < s.length; i++)
{
let temp_char = s[i];
let b = temp_char - '0' ;
let count = 0;
for (let j = 0; j < s.length; j++)
{
let temp = s[j] - '0' ;
if (temp == i)
{
count++;
}
}
if (count != b)
return false ;
}
return true ;
}
let N = 1000000;
for (let i = 1; i <= N; i++)
if (isSelfDescriptiveNumber(i))
console.log(i);
|
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
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);
}
}
|
Python3
def isSelfDescriptiveNumber(num):
str_ = str (num)
freq = [ 0 for _ in range ( 10 )]
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
N = 1000000
for i in range ( 1 , 1 + N):
if (isSelfDescriptiveNumber(i)):
print (i)
|
C#
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);
}
}
|
Javascript
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);
|
Time Complexity: O( N*len(N) )
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...