ভগ্নাংশের একটি তালিকা দেওয়া আছে, প্রতিটি [লব, হর] আকারে। এই ভগ্নাংশগুলোকে নিম্নলিখিত নিয়ম মেনে একটি নতুন তালিকা তৈরি করতে হবে:
- সবচেয়ে সরল রূপে আনা (যেমন 20/14 → 10/7)
- ডুপ্লিকেট ভগ্নাংশ মুছে ফেলা
- বাস্তব মান অনুযায়ী আরোহী ক্রমে সাজানো
- ঋণাত্মক হলে '-' চিহ্ন লবের সাথে রাখা
উদাহরণ
ইনপুট: {{16,8}, {4,2}, {7,3}, {14,6}, {20,4}, {-6,12}}
আউটপুট: [[-1,2], [2,1], [7,3], [5,1]]
সমাধানের পদ্ধতি
- প্রতিটি ভগ্নাংশের GCD বের করে লব ও হরকে ভাগ করুন।
- সেট (set) ব্যবহার করে ডুপ্লিকেট মুছুন।
- বাস্তব মান (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দিয়ে স্বয়ংক্রিয় ডুপ্লিকেট রিমুভাল ও সর্টিং- কাস্টম কম্পেরেটর দিয়ে বাস্তব মান অনুযায়ী সর্ট