ধরুন আমাদের একটি ইন্টিজার num আছে। আমাদের দুটি ইন্টিজার খুঁজে বের করতে হবে যেসবির অ্যাবসোলিউট ডিফারেন্স ন্যূনতম এবং যেসবির গুণফল num + 1 বা num + 2-এর সমান। দুটি ইন্টিজার যেকোনো অর্ডারে রিটার্ন করুন। ইনপুট 8 হলে আউটপুট [3, 3], কারণ num + 1 = 9, এর ক্লোসেস্ট ডিভাইজার 3 এবং 3; num + 2 = 10, এর ক্লোসেস্ট ডিভাইজার 2 এবং 5, তাই 3 এবং 3 বেছে নেওয়া হয়।
সমাধানের ধাপগুলো:
getDiv() মেথড ডিফাইন করুন, যা x ইনপুট নেবে
diff := ইনফিনিটি, সাইজ ২-এর একটি ret অ্যারে তৈরি করুন
i = 1 থেকে i^2 <= x পর্যন্ত লুপ চালান, i ১ বাড়াতে
যদি x i-দিয়ে বিভাজ্য হয়
a := i
b := x / i
newDiff := |a – b|
যদি newDiff < diff হয়, তবে
diff := newDiff
ret[0] := a এবং ret[1] := b
ret রিটার্ন করুন
মেইন মেথড থেকে op1 := getDiv(num + 1) এবং op2 := getDiv(num + 2) বের করুন
যদি |op1[0] – op1[1]| <= |op2[0] – op2[1]| হয়, তবে op1 রিটার্ন করুন, অন্যথায় op2
উদাহরণ (C++)
নিচের ইমপ্লিমেন্টেশন দেখুন ভালো বুঝতে −
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector <int> getDiv(int x){ int diff = INT_MAX; vector <int> ret(2); for(int i = 1; i * i <= x; i++){ if(x % i == 0){ int a = i; int b = x / i; int newDiff = abs(a - b); if(newDiff < diff){ diff = newDiff; ret[0] = a; ret[1] = b; } } } return ret; } vector<int> closestDivisors(int num) { vector <int> op1 = getDiv(num + 1); vector <int> op2 = getDiv(num + 2); return abs(op1[0] - op1[1]) <= abs(op2[0] - op2[1]) ? op1 : op2; } }; main(){ Solution ob; print_vector(ob.closestDivisors(8)); }
ইনপুট
8
আউটপুট
[3,3]