A frugal number is a number whose number of digits is strictly greater than the number of digits in its prime factorization (including exponents). If the exponent is 1 for a certain prime, involved in the prime factorization, then that exponent does not contribute to the number of digits in the prime factorization.
Some examples of frugal numbers are:
1) 125 = , here the number of digits in the number is three (1, 2 and 5) which is strictly greater than the number of digits in its prime factorization which is two (5 and 3).
2) 512 = , here the number of digits in the number is three (5, 1 and 2) which is strictly greater than the number of digits in its prime factorization which is two (2 and 9).
3) 1029 = 3 × , here the number of digits in the number is four (1, 0, 2 and 9) which is strictly greater than the number of digits its prime factorization which is three (3, 7 and 3).
The first few frugal numbers are : 125, 128, 243, 256, 343, 512, 625, 729, ….
It may be noted here that prime numbers are not frugal numbers, since the number of digits in the prime factorization of a prime number is equal to the number of digits in the prime number (since exponents of value 1 are not considered).
Example 19 = , but the 1 in the exponent does not contribute to the number of digits in the prime factorization of the number. Hence the number of digits in the number is two (1 and 9), which is equal to the number of digits in its prime factorization (1 and 9).
A program to find whether a number, ‘n’ is frugal or not involves simple steps. First, we find all prime numbers upto ‘n’ and then find the prime factorization of n. Finally, we check whether the number of digits in n, is greater than the number of digits in the prime factorization of n.
C++
#include <bits/stdc++.h>
using namespace std;
vector< long long int > primes( long long int n)
{
bool prime[n + 1];
memset (prime, true , sizeof (prime));
for ( int i = 2; i * i <= n; i++) {
if (prime[i] == true ) {
for ( int j = i * 2; j <= n; j += i)
prime[j] = false ;
}
}
vector< long long int > arr;
for ( int i = 2; i < n; i++)
if (prime[i])
arr.push_back(i);
return arr;
}
int countDigits( long long int n)
{
long long int temp = n;
int c = 0;
while (temp != 0) {
temp = temp / 10;
c++;
}
return c;
}
bool frugal( long long int n)
{
vector< long long int > r = primes(n);
long long int t = n;
long long int s = 0;
for ( int i = 0; i < r.size(); i++) {
if (t % r[i] == 0) {
long long int k = 0;
while (t % r[i] == 0) {
t = t / r[i];
k++;
}
if (k == 1)
s = s + countDigits(r[i]);
else if (k != 1)
s = s + countDigits(r[i]) + countDigits(k);
}
}
return (countDigits(n) > s && s != 0);
}
int main()
{
long long int n = 343;
if (frugal(n))
cout << "A Frugal number\n" ;
else
cout << "Not a frugal number\n" ;
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG
{
static ArrayList<Long>
primes( long n)
{
boolean []prime =
new boolean [( int )n + 1 ];
for ( int i = 0 ;
i < n + 1 ; i++)
prime[i] = true ;
for ( int i = 2 ;
i * i <= n; i++)
{
if (prime[i] == true )
{
for ( int j = i * 2 ;
j <= n; j += i)
prime[j] = false ;
}
}
ArrayList<Long> arr =
new ArrayList<Long>();
for ( int i = 2 ; i < n; i++)
if (prime[i])
arr.add(( long )i);
return arr;
}
static int countDigits( long n)
{
long temp = n;
int c = 0 ;
while (temp != 0 )
{
temp = temp / 10 ;
c++;
}
return c;
}
static boolean frugal( long n)
{
ArrayList<Long> r = primes(n);
long t = n;
long s = 0 ;
for ( int i = 0 ;
i < r.size(); i++)
{
if (t % r.get(i) == 0 )
{
long k = 0 ;
while (t % r.get(i) == 0 )
{
t = t / r.get(i);
k++;
}
if (k == 1 )
s = s + countDigits(r.get(i));
else if (k != 1 )
s = s + countDigits(r.get(i)) +
countDigits(k);
}
}
return (countDigits(n) > s && s != 0 );
}
public static void main(String[] args)
{
long n = 343 ;
if (frugal(n))
System.out.print( "A Frugal number\n" );
else
System.out.print( "Not a frugal number\n" );
}
}
|
Python3
C#
using System;
using System.Collections.Generic;
class GFG
{
static List< long > primes( long n)
{
bool []prime = new bool [n + 1];
for ( int i = 0; i < n + 1; i++)
prime[i] = true ;
for ( int i = 2; i * i <= n; i++)
{
if (prime[i] == true )
{
for ( int j = i * 2;
j <= n; j += i)
prime[j] = false ;
}
}
List< long > arr = new List< long >();
for ( int i = 2; i < n; i++)
if (prime[i])
arr.Add(i);
return arr;
}
static int countDigits( long n)
{
long temp = n;
int c = 0;
while (temp != 0)
{
temp = temp / 10;
c++;
}
return c;
}
static bool frugal( long n)
{
List< long > r = primes(n);
long t = n;
long s = 0;
for ( int i = 0; i < r.Count; i++)
{
if (t % r[i] == 0)
{
long k = 0;
while (t % r[i] == 0)
{
t = t / r[i];
k++;
}
if (k == 1)
s = s + countDigits(r[i]);
else if (k != 1)
s = s + countDigits(r[i]) +
countDigits(k);
}
}
return (countDigits(n) > s && s != 0);
}
static void Main()
{
long n = 343;
if (frugal(n))
Console.Write( "A Frugal number\n" );
else
Console.Write( "Not a frugal number\n" );
}
}
|
PHP
Javascript
Time Complexity: O(nlog(logn))
Auxiliary Space: O(n)
Please suggest if someone has a better solution which is more efficient in terms of space and time.
Optimization :
The above code can be optimized using the approach discussed in Print all prime factors and their powers
Last Updated :
23 Jun, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...