📜  相同位数乘积的最大数量

📅  最后修改于: 2021-04-21 21:43:27             🧑  作者: Mango

给定一个表示整数的字符串str ,任务是查找没有任何前导或尾随零或其数字的阶乘的乘积等于str的数字的阶乘的乘积的最大数字。

例子:

方法:

  • str的每个数字的阶乘表示为质数阶乘的乘积
  • 如果str的数字只包含01 ,则显示给定的数字,因为没有前导和尾随零或一的情况下就不可能输出。
  • 如果遇到数字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!
  • 最后,将生成的数字按降序排列以形成数字,以获得满足条件的最大数字。

插图:

下面是上述方法的实现:

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