Open In App

Maximum number with same digit factorial product

Last Updated : 08 Jul, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Given a string str which represents an integer, the task is to find the largest number without any leading or trailing zeros or ones whose product of the factorial of its digits is equal to the product of the factorial of digits of str.
Examples: 
 

Input: N = 4370 
Output: 73322 
4! * 3! * 7! * 0! = 7! * 3! * 3! * 2! * 2! = 725760
Input: N = 1280 
Output: 72222 
1! * 2! * 8! * 0! = 7! * 2! * 2! * 2! * 2! = 80640 
 

 

Approach: 
 

  • Express the factorial of each of the digits of str as product of factorial of prime numbers.
  • If str contains only 0 or 1 as its digits, then display the given number as output is not possible without leading and trailing zeros or ones.
  • If digits 1, 2, 3, 5 or 7 are encountered then they need to be included as the digits in the resultant number.
  • If digits 4, 6, 8 or 9 are encountered then express them as product of factorial of prime numbers, 
    • 4! can be expressed as 3! * 2! * 2!.
    • 6! can be expressed as 5! * 3!.
    • 8! can be expressed as 7! * 2! * 2! * 2!.
    • And 9! can be expressed as 7! * 3! * 3! * 2!.
  • Finally, form the number by arranging the generated digits in descending order in order to get the maximum number satisfying the condition.

Illustration: 
 

Let us consider a given input 4370. The factorial of each of its digits are as follows : 
4! = 24 = 2! * 2 ! * 3! 
3! = 6 = 3! 
7! = 5040 = 7! 
Hence the frequency of the digits in the maximum number are : 
 

  • Frequency of 7 is 1.

 

  • Frequency of 3 is 2.

 

  • Frequency of 2 is 2.

Hence The output is 73322. 
 

Below is the implementation of the above approach: 
 

C++




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the required number
string getNumber(string s)
{
    int number_of_digits = s.length();
 
    int freq[10] = { 0 };
 
    // Count the frequency of each digit
    for (int i = 0; i < number_of_digits; i++) {
        if (s[i] == '1'
            || s[i] == '2'
            || s[i] == '3'
            || s[i] == '5'
            || s[i] == '7') {
            freq[s[i] - 48] += 1;
        }
 
        // 4! can be expressed as 2! * 2! * 3!
        if (s[i] == '4') {
            freq[2] += 2;
            freq[3]++;
        }
 
        // 6! can be expressed as 5! * 3!
        if (s[i] == '6') {
            freq[5]++;
            freq[3]++;
        }
 
        // 8! can be expressed as 7! * 2! * 2! * 2!
 
        if (s[i] == '8') {
            freq[7]++;
            freq[2] += 3;
        }
 
        // 9! can be expressed as 7! * 3! * 3! * 2!
 
        if (s[i] == '9') {
            freq[7]++;
            freq[3] += 2;
            freq[2]++;
        }
    }
 
    // To store the required number
    string t = "";
 
    // If number has only either 1 and 0 as its digits
    if (freq[1] == number_of_digits
        || freq[0] == number_of_digits
        || (freq[0] + freq[1]) == number_of_digits) {
        return s;
    }
    else {
 
        // Generate the greatest number possible
        for (int i = 9; i >= 2; i--) {
            int ctr = freq[i];
            while (ctr--) {
                t += (char)(i + 48);
            }
        }
 
        return t;
    }
}
 
// Driver code
int main()
{
    string s = "1280";
    cout << getNumber(s);
    return 0;
}


Java




// Java implementation of the approach
 
import java.io.*;
 
class GFG {
 
// Function to return the required number
static String getNumber(String s)
{
    int number_of_digits = s.length();
 
    int freq[] = new int[10];
 
    // Count the frequency of each digit
    for (int i = 0; i < number_of_digits; i++) {
        if (s.charAt(i) == '1'
            || s.charAt(i) == '2'
            || s.charAt(i) == '3'
            || s.charAt(i) == '5'
            || s.charAt(i) == '7') {
            freq[s.charAt(i) - 48] += 1;
        }
 
        // 4! can be expressed as 2! * 2! * 3!
        if (s.charAt(i) == '4') {
            freq[2] += 2;
            freq[3]++;
        }
 
        // 6! can be expressed as 5! * 3!
        if (s.charAt(i) == '6') {
            freq[5]++;
            freq[3]++;
        }
 
        // 8! can be expressed as 7! * 2! * 2! * 2!
 
        if (s.charAt(i) == '8') {
            freq[7]++;
            freq[2] += 3;
        }
 
        // 9! can be expressed as 7! * 3! * 3! * 2!
 
        if (s.charAt(i) == '9') {
            freq[7]++;
            freq[3] += 2;
            freq[2]++;
        }
    }
 
    // To store the required number
    String t = "";
 
    // If number has only either 1 and 0 as its digits
    if (freq[1] == number_of_digits
        || freq[0] == number_of_digits
        || (freq[0] + freq[1]) == number_of_digits) {
        return s;
    }
    else {
 
        // Generate the greatest number possible
        for (int i = 9; i >= 2; i--) {
            int ctr = freq[i];
            while ((ctr--)>0) {
                t += (char)(i + 48);
            }
        }
 
        return t;
    }
}
 
    // Driver code
 
    public static void main (String[] args) {
            String s = "1280";
    System.out.println(getNumber(s));
    }
}
 
// This code is contributed by anuj_67..


Python3




# Python3 implementation of the approach
 
# Function to return the required number
def getNumber(s):
 
    number_of_digits = len(s);
 
    freq=[0]*10;
 
    # Count the frequency of each digit
    for i in range(number_of_digits):
        if (s[i] == '1'    or s[i] == '2' or s[i] == '3' or s[i] == '5' or s[i] == '7'):
            freq[ord(s[i]) - 48] += 1;
 
        # 4! can be expressed as 2! * 2! * 3!
        if (s[i] == '4'):
            freq[2] += 2;
            freq[3]+=1;
 
        # 6! can be expressed as 5! * 3!
        if (s[i] == '6'):
            freq[5]+=1;
            freq[3]+=1;
 
        # 8! can be expressed as 7! * 2! * 2! * 2!
 
        if (s[i] == '8'):
            freq[7]+=1;
            freq[2] += 3;
 
        # 9! can be expressed as 7! * 3! * 3! * 2!
 
        if (s[i] == '9'):
            freq[7]+=1;
            freq[3] += 2;
            freq[2]+=1;
 
    # To store the required number
    t = "";
 
    # If number has only either 1 and 0 as its digits
    if (freq[1] == number_of_digits or freq[0] == number_of_digits or (freq[0] + freq[1]) == number_of_digits):
        return s;
    else:
 
        # Generate the greatest number possible
        for i in range(9,1,-1):
            ctr = freq[i];
            while (ctr>0):
                t += chr(i + 48);
                ctr-=1;
 
        return t;
 
# Driver code
 
s = "1280";
print(getNumber(s));
 
 
# This code is contributed by mits


C#




// C# implementation of the approach
using System;
 
class GFG
{
 
// Function to return the
// required number
static String getNumber(string s)
{
    int number_of_digits = s.Length;
 
    int []freq = new int[10];
 
    // Count the frequency of each digit
    for (int i = 0;
             i < number_of_digits; i++)
    {
        if (s[i] == '1' || s[i] == '2' ||
            s[i] == '3' || s[i] == '5' ||
            s[i] == '7')
        {
            freq[s[i] - 48] += 1;
        }
 
        // 4! can be expressed as 2! * 2! * 3!
        if (s[i] == '4')
        {
            freq[2] += 2;
            freq[3]++;
        }
 
        // 6! can be expressed as 5! * 3!
        if (s[i] == '6')
        {
            freq[5]++;
            freq[3]++;
        }
 
        // 8! can be expressed as 7! * 2! * 2! * 2!
        if (s[i] == '8')
        {
            freq[7]++;
            freq[2] += 3;
        }
 
        // 9! can be expressed as 7! * 3! * 3! * 2!
        if (s[i] == '9')
        {
            freq[7]++;
            freq[3] += 2;
            freq[2]++;
        }
    }
 
    // To store the required number
    string t = "";
 
    // If number has only either 1
    // and 0 as its digits
    if (freq[1] == number_of_digits ||
        freq[0] == number_of_digits ||
       (freq[0] + freq[1]) == number_of_digits)
    {
        return s;
    }
    else
    {
 
        // Generate the greatest number possible
        for (int i = 9; i >= 2; i--)
        {
            int ctr = freq[i];
            while ((ctr--)>0)
            {
                t += (char)(i + 48);
            }
        }
 
        return t;
    }
}
 
// Driver code
public static void Main ()
{
    string s = "1280";
    Console.WriteLine(getNumber(s));
}
}
 
// This code is contributed by anuj_67..


PHP




<?php
// PHP implementation of the approach
 
// Function to return the required number
function getNumber($s)
{
    $number_of_digits = strlen($s);
 
    $freq=array_fill(0,10,0);
 
    // Count the frequency of each digit
    for ($i = 0; $i < $number_of_digits; $i++) {
        if ($s[$i] == '1'
            || $s[$i] == '2'
            || $s[$i] == '3'
            || $s[$i] == '5'
            || $s[$i] == '7') {
            $freq[ord($s[$i]) - 48] += 1;
        }
 
        // 4! can be expressed as 2! * 2! * 3!
        if ($s[$i] == '4') {
            $freq[2] += 2;
            $freq[3]++;
        }
 
        // 6! can be expressed as 5! * 3!
        if ($s[$i] == '6') {
            $freq[5]++;
            $freq[3]++;
        }
 
        // 8! can be expressed as 7! * 2! * 2! * 2!
 
        if ($s[$i] == '8') {
            $freq[7]++;
            $freq[2] += 3;
        }
 
        // 9! can be expressed as 7! * 3! * 3! * 2!
 
        if ($s[$i] == '9') {
            $freq[7]++;
            $freq[3] += 2;
            $freq[2]++;
        }
    }
 
    // To store the required number
    $t = "";
 
    // If number has only either 1 and 0 as its digits
    if ($freq[1] == $number_of_digits
        || $freq[0] == $number_of_digits
        || ($freq[0] + $freq[1]) == $number_of_digits) {
        return $s;
    }
    else {
 
        // Generate the greatest number possible
        for ($i = 9; $i >= 2; $i--) {
            $ctr = $freq[$i];
            while ($ctr--) {
                $t .= chr($i + 48);
            }
        }
 
        return $t;
    }
}
 
// Driver code
 
    $s = "1280";
    echo getNumber($s);
 
// this code is contributed by mits
?>


Javascript




<script>
    // Javascript implementation of the approach
     
    // Function to return the
    // required number
    function getNumber(s)
    {
        let number_of_digits = s.length;
 
        let freq = new Array(10);
        freq.fill(0);
 
        // Count the frequency of each digit
        for (let i = 0; i < number_of_digits; i++)
        {
            if (s[i] == '1' || s[i] == '2' ||
                s[i] == '3' || s[i] == '5' ||
                s[i] == '7')
            {
                freq[s[i].charCodeAt() - 48] += 1;
            }
 
            // 4! can be expressed as 2! * 2! * 3!
            if (s[i] == '4')
            {
                freq[2] += 2;
                freq[3]++;
            }
 
            // 6! can be expressed as 5! * 3!
            if (s[i] == '6')
            {
                freq[5]++;
                freq[3]++;
            }
 
            // 8! can be expressed as 7! * 2! * 2! * 2!
            if (s[i] == '8')
            {
                freq[7]++;
                freq[2] += 3;
            }
 
            // 9! can be expressed as 7! * 3! * 3! * 2!
            if (s[i] == '9')
            {
                freq[7]++;
                freq[3] += 2;
                freq[2]++;
            }
        }
 
        // To store the required number
        let t = "";
 
        // If number has only either 1
        // and 0 as its digits
        if (freq[1] == number_of_digits ||
            freq[0] == number_of_digits ||
           (freq[0] + freq[1]) == number_of_digits)
        {
            return s;
        }
        else
        {
 
            // Generate the greatest number possible
            for (let i = 9; i >= 2; i--)
            {
                let ctr = freq[i];
                while ((ctr--)>0)
                {
                    t += String.fromCharCode(i + 48);
                }
            }
 
            return t;
        }
    }
     
    let s = "1280";
    document.write(getNumber(s));
 
</script>


Output: 

72222

 

Time Complexity: O(1)

Auxiliary Space: O(1)



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads