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

C++-এ уникаল ভগ্নাংশ: সরলীকরণ, ডুপ্লিকেট মুছে সর্টিং

ভগ্নাংশের একটি তালিকা দেওয়া আছে, প্রতিটি [লব, হর] আকারে। এই ভগ্নাংশগুলোকে নিম্নলিখিত নিয়ম মেনে একটি নতুন তালিকা তৈরি করতে হবে:

  • সবচেয়ে সরল রূপে আনা (যেমন 20/14 → 10/7)
  • ডুপ্লিকেট ভগ্নাংশ মুছে ফেলা
  • বাস্তব মান অনুযায়ী আরোহী ক্রমে সাজানো
  • ঋণাত্মক হলে '-' চিহ্ন লবের সাথে রাখা

উদাহরণ

ইনপুট: {{16,8}, {4,2}, {7,3}, {14,6}, {20,4}, {-6,12}}

আউটপুট: [[-1,2], [2,1], [7,3], [5,1]]

সমাধানের পদ্ধতি

  1. প্রতিটি ভগ্নাংশের GCD বের করে লব ও হরকে ভাগ করুন।
  2. সেট (set) ব্যবহার করে ডুপ্লিকেট মুছুন।
  3. বাস্তব মান (double) অনুযায়ী সর্ট করুন।

C++ বাস্তবায়ন

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

class Solution {
public:
    static bool cmp(vector<int>& a, vector<int>& b) {
        double aa = (double)a[0] / a[1];
        double bb = (double)b[0] / b[1];
        return aa < bb;
    }
    
    vector<vector<int>> solve(vector<vector<int>>& v) {
        set<vector<int>> s;
        vector<vector<int>> r;
        
        for (auto& frac : v) {
            int g = __gcd(abs(frac[0]), abs(frac[1]));
            frac[0] /= g;
            frac[1] /= g;
            r.push_back({frac[0], frac[1]});
        }
        
        sort(r.begin(), r.end(), cmp);
        
        vector<vector<int>> ret;
        for (auto& f : r) {
            if (ret.empty() || ret.back() != f)
                ret.push_back(f);
        }
        return ret;
    }
};

int main() {
    vector<vector<int>> v = {{16,8},{4,2},{7,3},{14,6},{20,4},{-6,12}};
    Solution ob;
    auto res = ob.solve(v);
    for (auto& f : res)
        cout << "[" << f[0] << ", " << f[1] << "] ";
    return 0;
}

মূল বিষয়গুলো

  • __gcd ব্যবহার করে সরলীকরণ
  • set দিয়ে স্বয়ংক্রিয় ডুপ্লিকেট রিমুভাল ও সর্টিং
  • কাস্টম কম্পেরেটর দিয়ে বাস্তব মান অনুযায়ী সর্ট
  1. C++-এ ইউনিক বাইনারি সার্চ ট্রি গণনা

  2. C++-এ ইউনিক বাইনারি সার্চ ট্রি II - সব ট্রি জেনারেট করা

  3. C++-এ vector::resize() বনাম vector::reserve() পার্থক্য

  4. C++-এ টাইপ ইনফারেন্স (Type Inference)