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

C++-এ অসুন্দর সংখ্যা (Ugly Numbers) ধারণকারী সাব-অ্যারের সর্বোচ্চ দৈর্ঘ্য


সমস্যা বিবরণ

N উপাদানের একটি অ্যারে arr[] দেওয়া আছে (0 ≤ arr[i] ≤ 1000)। কাজ হলো শুধু অসুন্দর সংখ্যা (ugly numbers) ধারণকারী সাব-অ্যারের সর্বোচ্চ দৈর্ঘ্য বের করা।

অসুন্দর সংখ্যা (Ugly numbers) হলো এমন সংখ্যা যাদের প্রাইম ফ্যাক্টর শুধু ২, ৩ বা ৫।

উদাহরণস্বরূপ নিচে সিরিজের কিছু সংখ্যা দেওয়া হলো: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15,…

উদাহরণ

ইনপুট অ্যারে যদি {1, 2, 7, 9, 120, 810, 374} হয়, তবে উত্তর হবে ৩ কারণ −

অসুন্দর সংখ্যার সবচেয়ে লম্বা সাব-অ্যারে হলো {9, 120, 810}

অ্যালগরিদম

  • একটি unordered_set নিন, এবং ১০০০-এর চেয়ে ছোট সকল অসুন্দর সংখ্যা সেটে ইনসার্ট করুন
  • দুটি ভেরিয়েবল current_max এবং max_so_far নিয়ে অ্যারে ট্রাভার্স করুন।
  • প্রতিটি উপাদানের জন্য যাচাই করুন সেটে আছে কিনা
  • যদি অসুন্দর সংখ্যা পাওয়া যায়, তবে current_max বাড়ান এবং max_so_far-এর সাথে তুলনা করুন
  • যদি current_max > max_so_far হয় তবে max_so_far = current_max করুন।
  • প্রতিবার নন-অসুন্দর উপাদান পাওয়া গেলে current_max = 0 রিসেট করুন।

উদাহরণ

#include <bits/stdc++.h> using namespace std; unsigned getUglyNumbers(int n) {    int ugly[n];    int i2 = 0, i3 = 0, i5 = 0;    int next_multiple_of_2 = 2;    int next_multiple_of_3 = 3;    int next_multiple_of_5 = 5;    int next_ugly_no = 1;    ugly[0] = 1;    for (int i = 1; i < n; i++) {       next_ugly_no = min(next_multiple_of_2, min(next_multiple_of_3, next_multiple_of_5));       ugly[i] = next_ugly_no;       if (next_ugly_no == next_multiple_of_2) {          i2 = i2 + 1;          next_multiple_of_2 = ugly[i2] * 2;       }       if (next_ugly_no == next_multiple_of_3) {          i3 = i3 + 1;          next_multiple_of_3 = ugly[i3] * 3;       }       if (next_ugly_no == next_multiple_of_5) {          i5 = i5 + 1;          next_multiple_of_5 = ugly[i5] * 5;       }    }    return next_ugly_no; } int maxUglySubarray(int arr[], int n) {    unordered_set<int> s;    int i = 1;    while (1) {       int next_ugly_number = getUglyNumbers(i);       if (next_ugly_number > 1000)          break;       s.insert(next_ugly_number);       i++;    }    int current_max = 0, max_so_far = 0;    for (int i = 0; i < n; i++) {       if (s.find(arr[i]) == s.end())          current_max = 0;       else {          current_max++;          max_so_far = max(current_max,          max_so_far);       }    }    return max_so_far; } int main() {    int arr[] = {1, 2, 7, 9, 120, 810, 374};    int n = sizeof(arr) / sizeof(arr[0]);    cout << "Maximum sub-array size of consecutive ugly numbers = " << maxUglySubarray(arr, n) << endl;    return 0; }

আউটপুট

প্রোগ্রামটি কম্পাইল ও এক্সিকিউট করলে নিচের আউটপুট পাওয়া যাবে −

Maximum sub-array size of consecutive ugly numbers = 3



  1. C++-এ ০ এবং ১-এর সেগমেন্টের সর্বোচ্চ দৈর্ঘ্য

  2. C++-এ অ্যারেতে সর্বোচ্চ GCD वाली পেয়ার বের করা

  3. C++-এ LCM যা গুণফলের সমান হয় এমন সর্বোচ্চ দৈর্ঘ্যের সাবঅ্যারে

  4. C++-এ পেয়ার গুলোর ম্যাক্সিমাম দৈর্ঘ্যের চেইন বের করা