কম্পিউটার টিউটোরিয়াল

C++-এ একই ডিজিট ফ্যাক্টোরিয়াল গুণফল বিশিষ্ট সর্বোচ্চ সংখ্যা


দেওয়া কাজ হল লিডিং বা ট্রেইলিং শূন্য বা এক ছাড়া এমন সর্বোচ্চ সংখ্যা খুঁজে বের করা যাদের ডিজিটগুলোর ফ্যাক্টোরিয়াল গুণফল দেওয়া সংখ্যা N-এর ডিজিটগুলোর ফ্যাক্টোরিয়াল গুণফলের সমান।

উদাহরণ দিয়ে বোঝা যাক

ইনপুট - N = 4912

আউটপুট - 73332222

ব্যাখ্যা - 4! * 9! * 1! * 2! = 7! * 3! * 3! * 3! * 2! * 2! * 2! * 2! = ১৭,৪১৮,২৪০

ইনপুট - N = 340

আউটপুট - 3322

প্রোগ্রামে ব্যবহৃত পদ্ধতি

  • সর্বোচ্চ উত্তর পেতে হলে দেওয়া সংখ্যক প্রাইম নম্বরের ফ্যাক্টোরিয়াল গুণফল হিসেবে প্রকাশ করতে হবে।

  • যদি দেওয়া সংখ্যাতে শুধু শূন্য ও এক থাকে তবে আউটপুট খুঁজে বের করা সম্ভব নয়।

  • MaxNum() ফাংশনে total_digits নামক একটি ইন্টিজার ভেরিয়েবল তৈরি করুন ডিজিটের মোট সংখ্যা সংরক্ষণ করার জন্য এবং Frq[] = {0} নামক একটি ইন্টিজার অ্যারে আরম্ভ করুন প্রতিটি উদ্ভূত সংখ্যার ফ্রিকোয়েন্সি সংরক্ষণ করার জন্য।

  • i=0 থেকে i<total_digits পর্যন্ত লুপ চালান এবং প্রতিটি ডিজিটের জন্য চেক করুন এটি প্রাইম কিনা।

  • যতি বর্তমান ডিজিট প্রাইম হয়, তবে সেটি Frq[] অ্যারেতে ১ যোগ করুন।

  • অন্যথায়, যদি ডিজিট প্রাইম না হয়, তবে আলাদা if স্টেটমেন্ট দিয়ে চেক করুন এটি ৪, ৬, ৮ বা ৯ কিনা এবং তার মৌলিক প্রাইম ফ্যাক্টোরিয়ালে ভেঙে ফ্রিকোয়েন্সি বাড়ান।

  • ফাইনাল আউটপুট সংরক্ষণের জন্য 'ans' নামক একটি খালি স্ট্রিং তৈরি করুন।

  • ফাইনাল ধাপে যাওয়ার আগে চেক করুন সংখ্যাতে শুধু এক ও শূন্য আছে কিনা। যদি হয়, তবে মূল স্ট্রিং ফেরত দিন অন্যথায় পরবর্তী ধাপে যান।

  • i=9 থেকে i>=2 পর্যন্ত লুপ চালান। C = Frq[i] টাইপ ইন্টিজার ভেরিয়েবল আরম্ভ করুন এবং ফর লুপের ভেতরে while(C--) কন্ডিশন সহ একটি হুইল লুপ তৈরি করুন যেখানে ans+=(char)(i+48) দিয়ে ফাইনাল আউটপুট স্ট্রিং ans-এ সংরক্ষণ করুন।

C++ প্রোগ্রাম উদাহরণ

#include <bits/stdc++.h>
using namespace std;

string MaxNum(string str){
    int total_digits = str.length();
    int Frq[15] = { 0 };
    // প্রতিটি ডিজিটের ফ্রিকোয়েন্সি বের করা
    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 (Frq[1] == total_digits || Frq[0] == total_digits || (Frq[0] + Frq[1]) == total_digits){
        return str;
    }
    else{
        // সম্ভাব্য সর্বোচ্চ সংখ্যা
        for (int i = 9; i >= 2; i--){
            int C = Frq[i];
            while (C--){
                ans += (char)(i + 48);
            }
        }
        return ans;
    }
}

// মেইন ফাংশন
int main(){
    string str = "340";
    cout << MaxNum(str);
    return 0;
}

আউটপুট

3322
  1. সি++-এ নাম্বার্স উইথ সেম কনসিকিউটিভ ডিফারেন্সেস (Numbers With Same Consecutive Differences)

  2. C++-এ একই সংখ্যক সেট বিট থাকা নম্বরগুলো যোগ করে ম্যাক্সিমাম সাম

  3. C++-এ অ্যারেতে সর্বোচ্চ গুণফল দায়ক কোয়াড্রুপল (Quadruple) নির্ণয়

  4. C++-এ দেওয়া গুণফল দিয়ে N পূর্ণসংখ্যার সর্বোচ্চ GCD