주어진 작업은 선행 또는 후행 0이 없는 최대 수를 찾는 것 또는 해당 자릿수의 계승의 곱이 주어진 숫자 N의 자릿수의 계승의 곱과 동일한 1을 찾는 것입니다.
이제 예제를 사용하여 무엇을 해야 하는지 이해합시다 -
입력 - N =4912
출력 − 73332222
설명 - 4! * 9! * 1! * 2! =7! * 삼! * 삼! * 삼! * 2! * 2! *2! *2! =17,418,240
입력 - N =340
출력 − 3322
아래 프로그램에서 사용하는 접근 방식은 다음과 같습니다.
-
최대 답을 얻으려면 주어진 숫자를 소수의 계승의 곱으로 표현해야 합니다.
주어진 숫자에 0과 1만 포함되어 있으면 출력을 찾을 수 없습니다.
-
MaxNum() 함수에서 int 유형의 변수 total_digits를 생성하여 총 자릿수를 저장하고 또한 발생하는 각 숫자의 빈도를 저장하기 위해 int 유형의 다른 배열 Frq[] ={0}를 초기화합니다.
-
i=0에서 i
-
현재 숫자가 소수이면 배열 Frq[]의 해당 위치에 1을 추가하기만 하면 됩니다.
-
나머지 숫자는 소수가 아닌 경우 별도의 if 문을 통해 4, 6, 8 또는 9인지 확인한 다음 기본 소수 계승으로 분해하고 그에 따라 빈도를 증가시킵니다.
-
최종 답변을 저장할 빈 문자열 'ans'를 만듭니다.
-
마지막 단계를 진행하기 전에 숫자에 1과 0만 포함되어 있는지 확인하세요. 그렇다면 단순히 원래 문자열을 반환하고 그렇지 않으면 다음 단계로 진행하십시오.
-
i=9에서 i>=2까지 루프합니다. int 유형의 변수 C =Frq[i]를 초기화하고 for 루프 내부에서 조건이 while(C--)인 while 루프를 생성합니다. 여기서 ans+=(char)(i+48)을 넣어 최종 답변을 문자열에 저장합니다. 앤.
예
#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