Equidigital Numbers
Last Updated :
06 Oct, 2023
A number n is called Equidigital if the number of digits in the prime factorization of n (including powers) is same as number of digits in n. For example 16 is an Equidigital number as its prime factorization is 2^4 and its prime factorization has total two digits (2 and 4) which is same as total number of digits in 16. As another example, 128 is not a Equidigital as its prime factorization is 2^7 and has total 2 digits (2 and 7), but number has 3 digits. All prime numbers are Equidigital. Given a number n, the task is to print all Equidigital numbers upto n. Examples:
Input: n = 10
Output: 1, 2, 3, 5, 7, 10.
Note that 4, 6, 8 and 9 are not Equidigital.
Input : n = 20
Output : 1 2 3 5 7 10 11 13 14 15 16 17 19
Method (To print all Equidigital numbers less than or equal to n)
- Count all primes upto 10^6 using Sieve of Sundaram.
- Find number of digits in n.
- Find all prime factors of n and do following for every prime factor p.
- Find number of digits in p.
- Count highest power of p that divides n.
- Find sum of above two.
- Compare two sums. If two sums are same, then return true.
Below is implementation of above idea.
C++
#include<bits/stdc++.h>
using namespace std;
const int MAX = 10000;
vector < int > primes;
void sieveSundaram()
{
bool marked[MAX/2 + 1] = {0};
for ( int i=1; i<=( sqrt (MAX)-1)/2; i++)
for ( int j=(i*(i+1))<<1; j<=MAX/2; j=j+2*i+1)
marked[j] = true ;
primes.push_back(2);
for ( int i=1; i<=MAX/2; i++)
if (marked[i] == false )
primes.push_back(2*i + 1);
}
bool isEquidigital( int n)
{
if (n == 1)
return true ;
int original_no = n;
int sumDigits = 0;
while (original_no > 0)
{
sumDigits++;
original_no = original_no/10;
}
int pDigit = 0 , count_exp = 0, p;
for ( int i = 0; primes[i] <= n/2; i++)
{
while (n % primes[i] == 0)
{
p = primes[i];
n = n/p;
count_exp++;
}
while (p > 0)
{
pDigit++;
p = p / 10;
}
while (count_exp > 1)
{
pDigit++;
count_exp = count_exp / 10;
}
}
if (n != 1)
{
while (n > 0)
{
pDigit++;
n = n/10;
}
}
return (pDigit == sumDigits);
}
int main()
{
sieveSundaram();
cout << "Printing first few Equidigital Numbers"
" using isEquidigital()\n" ;
for ( int i=1; i<20; i++)
if (isEquidigital(i))
cout << i << " " ;
return 0;
}
|
Java
import java.util.Vector;
import static java.lang.Math.sqrt;
class GFG
{
static final int MAX = 10000 ;
static Vector<Integer> primes = new Vector<Integer>(MAX+ 1 );
static void sieveSundaram()
{
boolean marked[] = new boolean [MAX/ 2 + 1 ];
for ( int i= 1 ; i<=(sqrt(MAX)- 1 )/ 2 ; i++)
for ( int j=(i*(i+ 1 ))<< 1 ; j<=MAX/ 2 ; j=j+ 2 *i+ 1 )
marked[j] = true ;
primes.add( 2 );
for ( int i= 1 ; i<=MAX/ 2 ; i++)
if (marked[i] == false )
primes.add( 2 *i + 1 );
}
static boolean isEquidigital( int n)
{
if (n == 1 )
return true ;
int original_no = n;
int sumDigits = 0 ;
while (original_no > 0 )
{
sumDigits++;
original_no = original_no/ 10 ;
}
int pDigit = 0 , count_exp = 0 , p = 0 ;
for ( int i = 0 ; primes.elementAt(i) <= n/ 2 ; i++)
{
while (n % primes.elementAt(i) == 0 )
{
p = primes.elementAt(i);
n = n/p;
count_exp++;
}
while (p > 0 )
{
pDigit++;
p = p / 10 ;
}
while (count_exp > 1 )
{
pDigit++;
count_exp = count_exp / 10 ;
}
}
if (n != 1 )
{
while (n > 0 )
{
pDigit++;
n = n/ 10 ;
}
}
return (pDigit == sumDigits);
}
public static void main (String[] args)
{
sieveSundaram();
System.out.println( "Printing first few Equidigital Numbers" +
" using isEquidigital()" );
for ( int i= 1 ; i< 20 ; i++)
if (isEquidigital(i))
System.out.print(i + " " );
}
}
|
Python3
import math
MAX = 10000 ;
primes = [];
def sieveSundaram():
marked = [ False ] * int ( MAX / 2 + 1 );
for i in range ( 1 , int ((math.sqrt( MAX ) - 1 ) / 2 ) + 1 ):
for j in range ((i * (i + 1 )) << 1 ,
int ( MAX / 2 ) + 1 , 2 * i + 1 ):
marked[j] = True ;
primes.append( 2 );
for i in range ( 1 , int ( MAX / 2 ) + 1 ):
if (marked[i] = = False ):
primes.append( 2 * i + 1 );
def isEquidigital(n):
if (n = = 1 ):
return True ;
original_no = n;
sumDigits = 0 ;
while (original_no > 0 ):
sumDigits + = 1 ;
original_no = int (original_no / 10 );
pDigit = 0 ;
count_exp = 0 ;
p = 0 ;
i = 0 ;
while (primes[i] < = int (n / 2 )):
while (n % primes[i] = = 0 ):
p = primes[i];
n = int (n / p);
count_exp + = 1 ;
while (p > 0 ):
pDigit + = 1 ;
p = int (p / 10 );
while (count_exp > 1 ):
pDigit + = 1 ;
count_exp = int (count_exp / 10 );
i + = 1 ;
if (n ! = 1 ):
while (n > 0 ):
pDigit + = 1 ;
n = int (n / 10 );
return (pDigit = = sumDigits);
sieveSundaram();
print ( "Printing first few Equidigital" ,
"Numbers using isEquidigital()" );
for i in range ( 1 , 20 ):
if (isEquidigital(i)):
print (i, end = " " );
|
C#
using System;
using System.Collections;
public class GFG
{
static int MAX = 10000;
static ArrayList primes = new ArrayList(MAX+1);
static void sieveSundaram()
{
bool [] marked = new bool [MAX/2 + 1];
for ( int i=1; i<=(Math.Sqrt(MAX)-1)/2; i++)
for ( int j=(i*(i+1))<<1; j<=MAX/2; j=j+2*i+1)
marked[j] = true ;
primes.Add(2);
for ( int i=1; i<=MAX/2; i++)
if (marked[i] == false )
primes.Add(2*i + 1);
}
static bool isEquidigital( int n)
{
if (n == 1)
return true ;
int original_no = n;
int sumDigits = 0;
while (original_no > 0)
{
sumDigits++;
original_no = original_no/10;
}
int pDigit = 0 , count_exp = 0, p = 0;
for ( int i = 0; ( int )primes[i] <= n/2; i++)
{
while (n % ( int )primes[i] == 0)
{
p = ( int )primes[i];
n = n/p;
count_exp++;
}
while (p > 0)
{
pDigit++;
p = p / 10;
}
while (count_exp > 1)
{
pDigit++;
count_exp = count_exp / 10;
}
}
if (n != 1)
{
while (n > 0)
{
pDigit++;
n = n/10;
}
}
return (pDigit == sumDigits);
}
public static void Main()
{
sieveSundaram();
Console.WriteLine( "Printing first few Equidigital Numbers using isEquidigital()" );
for ( int i=1; i<20; i++)
if (isEquidigital(i))
Console.Write(i + " " );
}
}
|
PHP
<?php
$MAX = 10000;
$primes = array ();
function sieveSundaram()
{
global $primes , $MAX ;
$marked = array_fill (0,( $MAX /2 + 1),false);
for ( $i =1; $i <=((int)sqrt( $MAX )-1)/2; $i ++)
for ( $j =( $i *( $i +1))<<1; $j <=(int)( $MAX /2); $j = $j +2* $i +1)
$marked [ $j ] = true;
array_push ( $primes ,2);
for ( $i =1; $i <=(int)( $MAX /2); $i ++)
if ( $marked [ $i ] == false)
array_push ( $primes ,2* $i + 1);
}
function isEquidigital( $n )
{
global $primes , $MAX ;
if ( $n == 1)
return true;
$original_no = $n ;
$sumDigits = 0;
while ( $original_no > 0)
{
$sumDigits ++;
$original_no = (int)( $original_no /10);
}
$pDigit = 0;
$count_exp = 0;
$p =0;
for ( $i = 0; $primes [ $i ] <= (int)( $n /2); $i ++)
{
while ( $n % $primes [ $i ] == 0)
{
$p = $primes [ $i ];
$n = (int)( $n / $p );
$count_exp ++;
}
while ( $p > 0)
{
$pDigit ++;
$p =(int)( $p / 10);
}
while ( $count_exp > 1)
{
$pDigit ++;
$count_exp = (int)( $count_exp / 10);
}
}
if ( $n != 1)
{
while ( $n > 0)
{
$pDigit ++;
$n = (int)( $n /10);
}
}
return ( $pDigit == $sumDigits );
}
sieveSundaram();
echo "Printing first few Equidigital Numbers using isEquidigital()\n" ;
for ( $i =1; $i <20; $i ++)
if (isEquidigital( $i ))
echo $i . " " ;
?>
|
Javascript
let MAX = 10000;
let primes = [];
function sieveSundaram()
{
let marked = new Array(Math.floor(MAX/2) + 1).fill(0);
for ( var i=1; i<=(Math.sqrt(MAX)-1)/2; i++)
for ( var j=(i*(i+1))<<1; j<=MAX/2; j=j+2*i+1)
marked[j] = true ;
primes.push(2);
for ( var i = 1; i <= MAX/2; i++)
if (marked[i] == false )
primes.push(2*i + 1);
}
function isEquidigital(n)
{
if (n == 1)
return true ;
var original_no = n;
var sumDigits = 0;
while (original_no > 0)
{
sumDigits++;
original_no = Math.floor(original_no/10);
}
var pDigit = 0 , count_exp = 0, p;
for ( var i = 0; primes[i] <= n/2; i++)
{
while (n % primes[i] == 0)
{
p = primes[i];
n = n/p;
count_exp++;
}
while (p > 0)
{
pDigit++;
p = p / 10;
}
while (count_exp > 1)
{
pDigit++;
count_exp = Math.floor(count_exp / 10);
}
}
if (n != 1)
{
while (n > 0)
{
pDigit++;
n = Math.floor(n/10);
}
}
return (pDigit == sumDigits);
}
sieveSundaram();
console.log( "Printing first few Equidigital Numbers using isEquidigital()" );
for ( var i = 1; i < 20; i++)
if (isEquidigital(i))
process.stdout.write(i + " " );
|
Output:
Printing first few Equidigital Numbers using isEquidigital()
1 2 3 5 7 10 11 13 14 15 16 17 19
Reference : https://en.wikipedia.org/wiki/Equidigital_number
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...