ภารกิจคือการหาจำนวนสูงสุดโดยไม่มีศูนย์นำหน้าหรือต่อท้าย หรือจำนวนที่ผลคูณของแฟคทอเรียลของหลักนั้นเท่ากับผลคูณของแฟกทอเรียลของหลักของตัวเลขที่ระบุ N
ตอนนี้มาทำความเข้าใจสิ่งที่เราต้องทำโดยใช้ตัวอย่าง -
ป้อนข้อมูล − N =4912
ผลผลิต − 73332222
คำอธิบาย − 4! * 9! * 1! * 2! =7! * 3! * 3! * 3! * 2! * 2! *2! *2! =17,418,240
ป้อนข้อมูล − N =340
ผลผลิต − 3322
แนวทางที่ใช้ในโปรแกรมด้านล่างดังนี้
-
เพื่อให้ได้คำตอบสูงสุด เราจะต้องแสดงจำนวนที่กำหนดเป็นผลคูณของแฟคทอเรียลของจำนวนเฉพาะ
หากตัวเลขที่ระบุมีเพียงศูนย์และอีกตัวหนึ่ง จะไม่สามารถค้นหาผลลัพธ์ได้
-
ในฟังก์ชัน MaxNum() ให้สร้างตัวแปร total_digits ของประเภท int เพื่อเก็บจำนวนหลักทั้งหมด และยังเริ่มต้นอาร์เรย์อื่น Frq[] ={0} ของประเภท int เพื่อเก็บความถี่ของตัวเลขที่เกิดขึ้นแต่ละตัว
-
วนจาก i=0 ถึง i
-
หากตัวเลขปัจจุบันเป็นจำนวนเฉพาะ ให้เพิ่ม 1 ไปยังตำแหน่งของอาร์เรย์ Frq[]
-
ตัวเลขอื่นที่ไม่ใช่จำนวนเฉพาะ จากนั้นให้ตรวจสอบว่าคำสั่ง if เป็น 4, 6, 8 หรือ 9 แยกจากกันหรือไม่ จากนั้นแยกออกเป็นแฟกทอเรียลเฉพาะพื้นฐานและเพิ่มความถี่ตามลำดับ
-
สร้างสตริงว่าง 'ans' เพื่อเก็บคำตอบสุดท้าย
-
ก่อนดำเนินการขั้นตอนสุดท้าย ให้ตรวจสอบว่าตัวเลขมีเพียงตัวเดียวและเลขศูนย์เท่านั้น หากเป็นเช่นนั้น ให้คืนค่าสตริงเดิม ไม่เช่นนั้นให้ไปยังขั้นตอนถัดไป
-
วนรอบจาก i=9 ถึง i>=2 เริ่มต้นตัวแปร C =Frq[i] ของประเภท int และภายใน for ลูปสร้างลูปในขณะที่มีเงื่อนไขในขณะที่ (C--) ซึ่งใส่ 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