给定一个表示整数的字符串str ,任务是查找没有任何前导或尾随零或其数字的阶乘的乘积等于str的数字的阶乘的乘积的最大数字。
例子:
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
方法:
- 将str的每个数字的阶乘表示为质数阶乘的乘积。
- 如果str的数字只包含0或1 ,则显示给定的数字,因为没有前导和尾随零或一的情况下就不可能输出。
- 如果遇到数字1、2、3、5或7 ,则需要将它们作为数字包括在结果数字中。
- 如果遇到数字4、6、8或9 ,则将它们表示为素数阶乘的乘积,
- 4!可以表示为3! * 2! * 2!
- 6!可以表示为5! * 3!。
- 8!可以表示为7! * 2! * 2! * 2!
- 还有9!可以表示为7! * 3! * 3! * 2!
- 最后,将生成的数字按降序排列以形成数字,以获得满足条件的最大数字。
插图:
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 :
Hence The output is 73322.
下面是上述方法的实现:
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[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
= 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
?>
输出:
72222