주어진 작업은 선행 또는 후행 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