# Maximum number with same digit factorial product

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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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 ` `using` `namespace` `std; ` ` `  `// Function to return the required number ` `string getNumber(string s) ` `{ ` `    ``int` `number_of_digits = s.length(); ` ` `  `    ``int` `freq = { 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; ` `            ``freq++; ` `        ``} ` ` `  `        ``// 6! can be expressed as 5! * 3! ` `        ``if` `(s[i] == ``'6'``) { ` `            ``freq++; ` `            ``freq++; ` `        ``} ` ` `  `        ``// 8! can be expressed as 7! * 2! * 2! * 2! ` ` `  `        ``if` `(s[i] == ``'8'``) { ` `            ``freq++; ` `            ``freq += 3; ` `        ``} ` ` `  `        ``// 9! can be expressed as 7! * 3! * 3! * 2! ` ` `  `        ``if` `(s[i] == ``'9'``) { ` `            ``freq++; ` `            ``freq += 2; ` `            ``freq++; ` `        ``} ` `    ``} ` ` `  `    ``// To store the required number ` `    ``string t = ``""``; ` ` `  `    ``// If number has only either 1 and 0 as its digits ` `    ``if` `(freq == number_of_digits ` `        ``|| freq == number_of_digits ` `        ``|| (freq + freq) == 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``; ` ` `  `    ``// 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; ` `            ``freq++; ` `        ``} ` ` `  `        ``// 6! can be expressed as 5! * 3! ` `        ``if` `(s[i] == ``'6'``)  ` `        ``{ ` `            ``freq++; ` `            ``freq++; ` `        ``} ` ` `  `        ``// 8! can be expressed as 7! * 2! * 2! * 2! ` `        ``if` `(s[i] == ``'8'``) ` `        ``{ ` `            ``freq++; ` `            ``freq += 3; ` `        ``} ` ` `  `        ``// 9! can be expressed as 7! * 3! * 3! * 2! ` `        ``if` `(s[i] == ``'9'``) ` `        ``{ ` `            ``freq++; ` `            ``freq += 2; ` `            ``freq++; ` `        ``} ` `    ``} ` ` `  `    ``// To store the required number ` `    ``string` `t = ``""``; ` ` `  `    ``// If number has only either 1  ` `    ``// and 0 as its digits ` `    ``if` `(freq == number_of_digits ||  ` `        ``freq == number_of_digits ||  ` `       ``(freq + freq) == 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

 `= 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 ` `?> `

Output:

```72222
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : vt_m, inderDuMCA, Mithun Kumar

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.