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
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP