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

C++ প্রোগ্রাম: সংখ্যার ইউনিক ফ্যাক্টরাইজেশন (পার্টিশন) জেনারেশন

সমস্যা

একটি পজিটিভ ইন্টিজার `n` দেওয়া আছে। `n`-কে পজিটিভ ইন্টিজারগুলোর যোগফল হিসেবে লেখার সব সম্ভাব্য ইউনিক উপায় (পার্টিশন) প্রিন্ট করুন। অর্ডার বিবেচনা করা হয় না (যেমন 2+1 এবং 1+2 একই)।

এলগরিদম

ব্যাকট্র্যাকিং / রিকার্শন ব্যবহার করে সব পার্টিশন জেনারেট করা হয়। একটি অ্যারে `p` রাখা হয় বর্তমান পার্টিশনের জন্য। প্রতিটি ধাপে সবচেয়ে ডানে থাকা নন-১ ভ্যালু খুঁজে বের করা হয়, তা ডিক্রিমেন্ট করা হয়, এবং বাকি ভ্যালুটাকে নতুন পার্টিশনে বিতরণ করা হয়।

উদাহরণ কোড

#include <iostream>
#include <vector>
using namespace std;

void printPartition(vector<int>& p, int len) {
    for (int i = 0; i < len; i++)
        cout << p[i] << " ";
    cout << "\n";
}

void generatePartitions(int n) {
    vector<int> p(n); // Max size n (all 1s)
    int k = 0;         // Last index
    p[k] = n;          // First partition = n itself

    while (true) {
        printPartition(p, k + 1);

        // Find rightmost non-1 value
        int rem_val = 0;
        while (k >= 0 && p[k] == 1) {
            rem_val += p[k];
            k--;
        }
        if (k < 0) return; // All 1s, done

        p[k]--;           // Decrease it
        rem_val++;        // Add 1 to remainder

        // Distribute remainder in parts of size p[k]
        while (rem_val > p[k]) {
            p[k + 1] = p[k];
            rem_val -= p[k];
            k++;
        }
        p[k + 1] = rem_val;
        k++;
    }
}

int main() {
    cout << "ইনপুট নম্বর: ";
    int n; cin >> n;
    cout << n << "-র সব ইউনিক পার্টিশন:\n";
    generatePartitions(n);
    return 0;
}

আউটপুট উদাহরণ

ইনপুট: 5
আউটপুট:
5
4 1
3 2
3 1 1
2 2 1
2 1 1 1
1 1 1 1 1

ব্যাখ্যা

এই অ্যালগরিদমটি লেক্সিকোগ্রাফিক অর্ডারে পার্টিশন জেনারেট করে। এটি ইন্টিজার পার্টিশন সমস্যার একটি ক্লাসিক ইটারেটিভ সমাধান। টাইম কমপ্লেক্সিটি পার্টিশন সংখ্যার অনুপাতিক (প্রায় O(n × p(n))), যেখানে p(n) হলো পার্টিশন ফাংশন।

  1. C++ প্রোগ্রাম: বাইনারি ট্রির ইনঅর্ডার নন-রিকারসিভ ট্রাভার্সাল

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

  3. C++-এ দেওয়া সংখ্যার ডিজিটগুলোর যোগফল বের করা

  4. জটিল সংখ্যা গুণফল বের করার C++ প্রোগ্রাম