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

C++-এ ফোর ডিভাইজারস (Four Divisors) সমস্যা সমাধান


ধরুন আমাদের একটি ইন্টিজার অ্যারে nums আছে। আমাদের সেটিতে যেসব ইন্টিজারের ঠিক চারটি ভাগফল (divisor) আছে, তাদের ভাগফলগুলোর যোগফল বের করতে হবে। যদি এমন কোনো ইন্টিজার না থাকে, তবে 0 রিটার্ন করুন। উদাহরণস্বরূপ, ইনপুট [21, 4, 7] হলে আউটপুট হবে ৩২, কারণ ২১-এর চারটি ভাগফল ১, ৩, ৭, ২১; ৪-এর তিনটি ভাগফল ১, ২, ৪; এবং ৭-এর দুটি ভাগফল ১ এবং ৭। উত্তর শুধু ২১-এর ভাগফলগুলোর যোগফল।

সমাধানের ধাপগুলো:

  • ok() নামে একটি মেথড ডিফাইন করুন, যা x ইনপুট নেবে

  • ret := 1 + x, cnt := 2

  • i := 2 থেকে i^2 <= x পর্যন্ত লুপ চালান, i ১ বাড়াতে

    • যদি x i-দিয়ে বিভাজ্য হয়

      • ret-এ i যোগ করুন, cnt ১ বাড়ান

      • যদি i != x/i হয়, তবে cnt ১ বাড়ান, ret := ret + (x/i)

  • যদি cnt == 4 হয় তবে ret রিটার্ন করুন, অন্যথায় 0

  • মেইন মেথড থেকে

  • ret := 0, n := nums-এর সাইজ

  • i = 0 থেকে n – 1 পর্যন্ত লুপ চালান

    • ret := ret + ok(nums[i])

  • ret রিটার্ন করুন

উদাহরণ (C++)

নিচের ইমপ্লিমেন্টেশন দেখুন ভালো বুঝতে −

#include <bits/stdc++.h> using namespace std; class Solution { public:    int ok(int x){       int ret = 1 + x;;       int cnt = 2;       for(int i = 2; i * i <= x; i++){          if(x % i == 0){             ret += (i);             cnt++;             if(i != x / i){                cnt++;                ret += (x / i);             }          }       }       return cnt == 4 ? ret : 0;    }    int sumFourDivisors(vector<int>& nums) {       int ret = 0;       int n = nums.size();       for(int i = 0; i < n; i++){          ret += ok(nums[i]);       }       return ret;    } }; main(){    vector<int> v = {21,4,7};    Solution ob;    cout << (ob.sumFourDivisors(v)); }

ইনপুট

[21,4,7]

আউটপুট

32
  1. C++-এ জাম্প গেম V (Jump Game V)

  2. সি++-এ বিউটিফুল অ্যারে (Beautiful Array)

  3. C++-এ K ডিজিট রিমুভ করে সবচেয়ে ছোট সংখ্যা বানানো

  4. C++-এ ক্লোসেস্ট ডিভাইজারস (Closest Divisors) সমস্যা সমাধান