Self Descriptive Number
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 numbersInput: 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 |
1210 2020 21200
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 |
1210 2020 21200
Time Complexity: O( N*len(N) )
Auxiliary Space: O(1)
Please Login to comment...