C++-এ গাণিতিক সমস্যা সমাধানের জন্য অগণিত ফাংশন আছে। 그중 একটি হলো বিজোড় ডিজিট দিয়ে গঠিত Nth সংখ্যা বের করা। এই আর্টিকেলে আমরা বিজোড় ডিজিট দিয়ে গঠিত Nth সংখ্যা বের করার সম্পূর্ণ পদ্ধতি এবং বিজোড় সংখ্যা কী ও কী সংখ্যা বিজোড় ডিজিট দিয়ে গঠিত সেটি বুঝব।
বিজোড় ডিজিট দিয়ে গঠিত Nth সংখ্যা বের করা
বিজোড় সংখ্যা ২ দিয়ে ভাগ করলে ভাগশেষ দেয়, তাই প্রথম কিছু বিজোড় সংখ্যা হল ১, ৩, ৫, ৭, ৯, ১১, ১৩, ১৫, ১৭, ১৯...।
প্রয়োজনীয় সংখ্যা বের করার জন্য আমাদের দুটি পদ্ধতি আছে −
পদ্ধতি ১ − প্রতিটি প্রাকৃতিক সংখ্যা চেক করো যে সেটি বিজোড় কিনা এবং প্রতিটি বিজোড় সংখ্যার জন্য কাউন্ট বাড়াও যতক্ষণ না কাউন্ট n-এর সমান হয়, এবং জোড় সংখ্যা পাওয়া গেলে কাউন্ট করো না, অর্থাৎ জোড় সংখ্যা স্কিপ করো এবং বিজোড় সংখ্যা কাউন্ট করো এবং প্রাপ্য Nth সংখ্যা দাও।
বিজোড় ডিজিট দিয়ে গঠিত Nth সংখ্যা বের করার এই পদ্ধতি সহজ কারণ আমরা শুধু প্রতিটি সংখ্যা চেক করি এবং জোড় সংখ্যা স্কিপ করি, কিন্তু কম্পিউটার প্রোগ্রামিং দৃষ্টিকোণ থেকে এই পদ্ধতিটি এই কাজ সম্পন্ন করতে অনেক সময় নেয়।
পদ্ধতি ২ − বিজোড় ডিজিট দিয়ে গঠিত প্রতিটি সংখ্যার শেষে ১, ৩, ৫, ৭, ৯ থাকতে পারে, তাই সেগুলো বিজোড় সংখ্যা। তাই আমরা প্রথমে চেক করি Nth সংখ্যা ১, ৩, ৫, ৭, ৯ কিনা; হ্যাঁ হলে উত্তর পেয়ে যাই; নাহলে অন্যান্য সম্ভাব্য সংখ্যাগুলোতে যাই, যেগুলো হল ১১, ১৩, ১৫, ১৭, ১৯ এবং তারপর ২১, ২৩, ২৫, ২৭, ২৯। এখানে একটি প্যাটার্ন বনে: ১ * ১০ + {শেষ সম্ভাব্য সংখ্যা}।
উদাহরণ
শেষ সম্ভাব্য সংখ্যাগুলো হল ১, ৩, ৫, ৭, ৯ পরবর্তী সম্ভাব্য সংখ্যাগুলো বের করা যায়: ১ * ১০ + ১ = ১১ ১ * ১০ + ৩ = ১৩ ১ * ১০ + ৫ = ১৫ ১ * ১০ + ৭ = ১৭ ১ * ১০ + ৯ = ১৯ অর্থাৎ ১১, ১৩, ১৫, ১৭, ১৯
নমুনা কোড
প্রথমে দেখি কোডটি কী রকম দেখে −
#include<bits/stdc++.h> using namespace std; int main(){ queue<int> q; int cnt = 0, ans = 0; int n; cin >> n; int a[5]={1,3,5,7,9}; for(int i = 0; i < 5;i++){ cnt++; if(cnt == n) ans = a[i]; q.push(a[i]); } if(ans) cout << ans << "\n"; else{ while(true){ int x = q.front(); q.pop(); for(int j = 0; j < 5; j++) { int temp = x * 10 + a[j]; q.push(temp); cnt++; if(cnt == n) ans = temp; } if(ans) break; } cout << ans << "\n"; } return 0; }
আউটপুট
9
(যখন ৫ ইনপুট দিই, তখন ৯ আউটপুট পাই)
উপরোক্ত কোডটি বিজোড় ডিজিট দিয়ে গঠিত Nth সংখ্যা বের করার C++ কোড। এই কোড বুঝতে আমরা এটি ভাগ করে প্রতিটি অংশ বুঝব।
কোডের ব্যাখ্যা
ধাপ ১ − ইউজার থেকে n নেওয়া এবং প্রয়োজনীয় ভেরিয়েবল ইনিশিয়ালাইজ।
int main() { queue<int> q; int cnt = 0, ans = 0; int n; cin >> n; int a[5]={1,3,5,7,9};
এখানে আমরা একটি কিউ তৈরি করি এবং cnt ভেরিয়েবল কাউন্ট রাখতে এবং ans উত্তর রাখতে। এছাড়া cin ব্যবহার করে ইউজার থেকে ইনপুট নিচ্ছি এবং প্রথম সম্ভাব্য সংখ্যাগুলোর সাথে একটি অ্যারে ইনিশিয়ালাইজ করছি।
ধাপ ২ − চেক করো Nth সংখ্যা প্রাথমিক সম্ভাব্য সংখ্যাগুলোতে আছে কিনা এবং সেগুলো কিউতে রাখো।
for(int i = 0; i < 5;i++){ cnt++; if(cnt == n) ans = a[i]; q.push(a[i]); } if(ans) cout << ans << "\n";
উপরের কোডে আমরা চেক করছি Nth সংখ্যা প্রথম সম্ভাব্য সংখ্যাগুলোতে (যা অ্যারেতে আছে) আছে কিনা এবং অ্যারেতে থাকা সংখ্যাগুলো কিউতে পুশ করছি, এবং যদি প্রথম সম্ভাব্য সংখ্যাগুলোতে Nth সংখ্যা পাওয়া যায় তবে আউটপুট দিচ্ছি।
ধাপ ৩ − পরবর্তী সম্ভাব্য সংখ্যাগুলোতে Nth সংখ্যা খুঁজো এবং কিউতে সংখ্যা পরিবর্তন করো যদি Nth সংখ্যা না পাওয়া যায়।
while(true) { int x = q.front(); q.pop(); for(int j = 0; j < 5; j++) { int temp = x * 10 + a[j]; q.push(temp); cnt++; if(cnt == n) ans = temp; } if(ans) break; } cout << ans << "\n"; }
শেষে, আমরা কিউ থেকে প্রতিটি সংখ্যা পপ করি এবং সেই সংখ্যা থেকে পরবর্তী সম্ভাব্য সংখ্যা বানাই ফর্মুলা { x * 10 + শেষ বিজোড় সংখ্যা } ব্যবহার করে এবং চেক করি cnt-এর মান n-এর সমান হয়েছে কিনা।
উপসংহার
এই আর্টিকেলে আমাদের একটি সমস্যা ছিল: বিজোড় ডিজিট দিয়ে গঠিত Nth বিজোড় সংখ্যা কীভাবে বের করতে হয়, এবং আমরা দুটি পদ্ধতি পেয়েছি। প্রথম পদ্ধতি বুঝতে সহজ ছিল কারণ সেটি শুধু প্রতিটি সংখ্যা চেক করে এবং জোড় সংখ্যা স্কিপ করে, কিন্তু কম্পিউটিং-এ সময় নিত।
দ্বিতীয় পদ্ধতিতে আমরা একটি কিউ ব্যবহার করি এবং বিজোড় সংখ্যাগুলো সেখানে স্টোর করি এবং উপরের ফর্মুলা ব্যবহার করে পরবর্তী সম্ভাব্য সংখ্যা বের করি। এই পদ্ধতির জটিলতা O(n)।
আমরা বিজোড় ডিজিট দিয়ে গঠিত Nth সংখ্যা বের করার C++ প্রোগ্রাম বানাইয়েছি; একই প্রোগ্রাম C, Python, Java বা অন্য প্রোগ্রামিং ভাষায়ও করা যায়। আশা করি এই আর্টিকেলটি সমস্যা সমাধানের পূর্ণ ধারণা দিতে সাহায্য করেছে।