C++ 中具有相同數字階乘積的最大數


給定任務是找到最大數,該數沒有前導或尾隨零或一,其數字階乘的乘積等於給定數字 N 的數字階乘的乘積。

現在讓我們用一個例子來理解我們必須做什麼 -

輸入 - N = 4912

輸出 - 73332222

解釋 - 4! * 9! * 1! * 2! = 7! * 3! * 3! * 3! * 2! * 2! *2! *2! = 17,418,240

輸入 - N = 340

輸出 - 3322

下面程式中使用的方案如下

  • 為了獲得最大答案,我們將不得不將給定數字表示為素數階乘的乘積。

    如果給定數字僅包含零和一,則無法找到輸出。

  • 在函式 MaxNum() 中,建立一個 int 型別的變數 total_digits 來儲存數字總數,並初始化另一個 int 型別的陣列 Frq[] = {0} 來儲存每個出現的數字的頻率。

  • 迴圈從 i=0 到 i<total_digits,並檢查每個數字是否為素數。

  • 如果當前數字是素數,則只需將陣列 Frq[] 的該位置加 1。

  • 否則,如果數字不是素數,則透過單獨的 if 語句檢查它是否為 4、6、8 或 9,然後將其分解為其基本素數階乘並相應地增加頻率。

  • 建立一個空字串 'ans' 來儲存最終答案。

  • 在繼續執行最後一步之前,檢查數字是否僅包含一和零。如果是,則只需返回原始字串,否則繼續執行下一步。

  • 迴圈從 i=9 到 i>=2。初始化一個 int 型別的變數 C = Frq[i],並在 for 迴圈內建立一個 while 迴圈,條件為 while(C--),其中放置 ans+=(char)(i+48) 將最終答案儲存到字串 ans 中。

示例

 線上演示

#include <bits/stdc++.h>
using namespace std;
string MaxNum(string str){
   int total_digits = str.length();
   int Frq[15] = { 0 };
   //Obtaining the frequency of every digit
   for (int i = 0; i < total_digits; i++){
      if (str[i] == '1'|| str[i] == '2'|| str[i] == '3'|| str[i] == '5'|| str[i] == '7'){
         Frq[str[i] - 48] += 1;
      }
      // 4! = 2! * 2! * 3!
      if (str[i] == '4'){
         Frq[2] += 2;
         Frq[3]++;
      }
      // 6! = 5! * 3!
      if (str[i] == '6'){
         Frq[5]++;
         Frq[3]++;
      }
      // 8! = 7! * 2! * 2! * 2!
      if (str[i] == '8'){
         Frq[7]++;
         Frq[2] += 3;
      }
      // 9! = 7! * 3! * 3! * 2!
      if (str[i] == '9'){
         Frq[7]++;
         Frq[3] += 2;
         Frq[2]++;
      }
   }
   string ans = "";
   //If number has only 1 or 0
   if (Frq[1] == total_digits || Frq[0] == total_digits || (Frq[0] + Frq[1]) == total_digits){
      return str;
   }
   else{
      //Maximum number possible
      for (int i = 9; i >= 2; i--){
         int C = Frq[i];
         while (C--){
            ans += (char)(i + 48);
         }
      }
      return ans;
   }
}
//Main function
int main(){
   string str = "340";
   cout << MaxNum(str);
   return 0;
}

輸出

如果我們執行上述程式碼,我們將得到以下輸出 -

3322

更新於: 2020-08-17

101 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.