এই টিউটোরিয়ালে, আমরা একটি প্রোগ্রাম লিখব যা এমন একটি সংখ্যা বের করে যেটার প্রতিটি অ্যারে এলিমেন্টের সাথে মডুলো একই। একটি উদাহরণ দেখি।
ইনপুট - arr = {10, 4, 2}
আউটপুট - 1 2
যদি দুটি সংখ্যা x, y থাকে এবং x > y, ধরি x - y = d।
তবে x = y + d।
মান লইয়া একটি সংখ্যা k যাতে x%k = y%k। উপরের সমীকরণে মডুলো k লাগিয়ে d বের করি।
x%k = (y+d)%k y%k = y%k + d%k d%k = 0
উপরের ক্যালকুলেশন থেকে, যদি সংখ্যা k হয় x এবং y-এর পার্থক্যের ডিভাইজর। তবে সেটি x এবং y-এর ডিভাইজরও হবে।
একই কনসেপ্ট অ্যারের এলিমেন্টগুলোর ওপর লাগিয়ে k মান বের করি। সমস্যাটি সমাধানের ধাপগুলো:
- অ্যারে নাম্বার দিয়ে ইনিশিয়ালাইজ করুন
- এখানে, d হবে অ্যারে এলিমেন্টগুলোর ম্যাক্স এবং মিন মান পার্থক্য।
- অ্যারে ভ্যালুগুলো সর্ট মেথড দিয়ে সর্ট করুন।
- লাস্ট এবং ফার্স্ট নাম্বারের পার্থক্য বের করুন।
- যদি পার্থক্য শূন্য হয়, তবে সব নাম্বার একই। তবে যেকোনো নম্বরের সাথে মডুলো একই রেজাল্ট দেবে।
- অন্যথায় সংখ্যা d-এর ডিভাইজরগুলো বের করুন। এবং স্টোর করুন।
- সকল ডিভাইজরে ইটারেট করুন এবং সেই নাম্বার বের করুন যেটার সব অ্যারে এলিমেন্টের সাথে মডুলো একই।
উদাহরণ
কোডটি দেখি।
#include <bits/stdc++.h>
using namespace std;
void findNumbers(int arr[], int n) {
sort(arr, arr + n);
int d = arr[n - 1] - arr[0];
// check whether all elements are same or not
if (d == 0) {
cout << "Infinite number of k's";
return;
}
// finding the divisors of d
vector <int> v;
for (int i = 1; i * i <= d; i++) {
if (d % i == 0) {
v.push_back(i);
if (i != d / i) {
v.push_back(d / i);
}
}
}
// findind the k's
for (int i = 0; i < v.size(); i++) {
int temp = arr[0] % v[i];
int j;
for (j = 1; j < n; j++) {
if (arr[j] % v[i] != temp) {
break;
}
}
if (j == n)
cout << v[i] << " ";
}
cout << endl;
}
int main() {
int arr[] = {10, 4, 2};
findNumbers(arr, 3);
return 0;
}
আউটপুট
1 2
উপসংহার
টিউটোরিয়ালে যদি কোনো প্রশ্ন থাকে, তবে কমেন্ট সেকশনে জানান।