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

C++-এ একটি দেওয়া পলিনোমিয়ালের রুটগুলোর যোগফল ন্যূনতম করা

আমাদের পূর্ণসংখ্যা উপাদান 지닌 একটি অ্যারে দেওয়া আছে যা একটি পলিনোমিয়ালের কোইফিশিয়েন্ট মানগুলো রিপ্রেজেন্ট করে। অ্যারের আকার হবে 'n' অর্থাৎ অ্যারেতে উপাদানগুলোর সংখ্যা। পলিনোমিয়ালের ডিগ্রি সবসময় n-1 থেকে শুরু হয় কারণ পলিনোমিয়াল সিরিজের শেষে একটি কনস্ট্যান্ট মান থাকবে। কাজটি হল কোইফিশিয়েন্টটিকে অন্য পলিনোমিয়াল দিয়ে রিপ্লেস করা যাতে রুটগুলোর যোগফল ন্যূনতম হয়।

বিভিন্ন ইনপুট-আউটপুট পরিস্থিতি দেখে নিই -

ইন - int arr[] = { 2, -1, 4, 9, -1, 10, -5}

আউট - একটি দেওয়া পলিনোমিয়ালের রুটগুলোর যোগফল ন্যূনতম করা: -1 -5 2 4 9 -1 10

ব্যাখ্যা - আমাদের ৭ উপাদান ধারণকারী একটি পূর্ণসংখ্যা অ্যারে দেওয়া আছে অর্থাৎ পলিনোমিয়ালের ঘাত হবে ৬। তাই আমরা ন্যূনতম আউটপুট পাব: -1 * x^6 - 5 * x^5 + 2 * x^4 + 4 * x^3 + 9 * x^2 - 1 * x^1 + 10 যা রুটগুলোর ন্যূনতম যোগফল -5 এবং 1 দেবে।

ইন - int arr[] = {3, -2, -1, 4}

আউট - একটি দেওয়া পলিনোমিয়ালের রুটগুলোর যোগফল ন্যূনতম করা: -1 -2 3 4

ব্যাখ্যা - আমাদের ৪ উপাদান ধারণকারী একটি পূর্ণসংখ্যা অ্যারে দেওয়া আছে অর্থাৎ পলিনোমিয়ালের ঘাত হবে ৩। তাই আমরা ন্যূনতম আউটপুট পাব: -1 * x^3 - 2 * x^2 + 3 * x^1 + 4 যা রুটগুলোর ন্যূনতম যোগফল -1 দেবে।

নিচের প্রোগ্রামে ব্যবহৃত পদ্ধতি

  • পূর্ণসংখ্যা উপাদান 지닌 একটি অ্যারে ইনপুট নিন এবং অ্যারের আকার গণনা করুন। ডেটা ফাংশনে পাস করুন आगे প্রসেসিং-এর জন্য।
  • Minimize_root(arr, size) ফাংশনের ভিতরে:
    • vec_1, vec_2, vec_3 নামে integer টাইপের ভেক্টর ভেরিয়েবল ডিক্লেয়ার করুন।
    • i = ০ থেকে অ্যারের আকার পর্যন্ত একটি FOR লুপ শুরু করুন। লুপের ভিতরে চেক করুন IF arr[i] > 0 তবে i কে vec_2-এ push_back করুন। ELSE IF, arr[i] < 0 তবে i কে vec_3-এ push_back করুন।
    • vec_2 এবং vec_3-এর আকার গণনা করুন।
    • চেক করুন IF vec_2_size >= 2 AND IF vec_3_size >= 2 তবে i = ০ থেকে vec_2-এর আকার পর্যন্ত একটি FOR লুপ শুরু করুন এবং লুপের ভিতরে চেক করুন IF arr[vec_2[i]] > max_val তবে temp = vec_2[i] এবং max_val = arr[temp] সেট করুন।
    • i = ০ থেকে vec_2-এর আকার পর্যন্ত একটি FOR লুপ শুরু করুন। লুপের ভিতরে চেক করুন IF arr[vec_2[i]] < min_val তবে চেক করুন IF vec_2[i] != temp তবে temp_2 = vec_2[i] এবং min_val = arr[temp_2] সেট করুন।
    • i = ০ থেকে vec_3-এর আকার পর্যন্ত একটি FOR লুপ শুরু করুন। লুপের ভিতরে চেক করুন IF abs(arr[vec_3[i]]) > N_max তবে N_temp = vec_3[i] এবং N_max = abs(arr[N_temp]) সেট করুন।
    • i = ০ থেকে vec_3 size পর্যন্ত একটি FOR লুপ শুরু করুন এবং চেক করুন IF abs(arr[vec_3[i]]) < N_min তবে চেক করুন IF vec_3[i] != N_temp তবে N_temp_2 = vec_3[i] এবং N_min = abs(arr[N_temp_2]) সেট করুন।
    • চেক করুন IF vec_2_data < vec_3_data তবে i = ০ থেকে অ্যারের আকার পর্যন্ত FOR লুপের ভিতরে চেক করুন IF i != temp_2 AND i != temp তবে arr[i] কে vec_1-এ push_back করুন। ELSE, i = ০ থেকে অ্যারের আকার পর্যন্ত FOR লুপের ভিতরে চেক করুন IF i != N_temp_2 AND i != N_temp তবে arr[i] কে vec_1-এ push_back করুন।
    • vec_1 ট্র্যাভার্স করার জন্য একটি FOR লুপ শুরু করুন এবং vec_1[i] প্রিন্ট করুন ফলাফল হিসেবে।
    • ELSE IF, vec_2_size >= 2 চেক করুন তবে i = ০ থেকে vec_2-এর আকার পর্যন্ত FOR লুপ শুরু করুন। চেক করুন IF arr[vec_2[i]] > max_val তবে temp = vec_2[i] এবং max_val = arr[temp] সেট করুন।
    • i = ০ থেকে vec_2.size() পর্যন্ত FOR লুপ শুরু করুন। লুপের ভিতরে চেক করুন IF arr[vec_2[i]] < min_val তবে চেক করুন IF vec_2[i] != temp তবে temp_2 = vec_2[i] এবং min_val = arr[temp_2] সেট করুন।
    • i = ০ থেকে অ্যারের আকার পর্যন্ত FOR লুপ শুরু করুন। লুপের ভিতরে চেক করুন IF i != temp_2 তবে চেক করুন IF i != temp তবে arr[i] কে vec_1-এ push_back করুন।
    • ELSE IF, vec_3 >= 2 চেক করুন তবে i = ০ থেকে vec_3 size পর্যন্ত FOR লুপ শুরু করুন এবং চেক করুন IF abs(arr[vec_3[i]]) > N_max তবে temp = vec_3[i] এবং N_max = abs(arr[temp]) সেট করুন।
    • i = ০ থেকে vec_3.size() পর্যন্ত FOR লুপ শুরু করুন এবং চেক করুন IF abs(arr[vec_3[i]]) < N_min তবে চেক করুন IF vec_3[i] != temp তবে temp_2 = vec_3[i] এবং N_min = abs(arr[temp_2]) সেট করুন।
    • i = ০ থেকে অ্যারের আকার পর্যন্ত FOR লুপ শুরু করুন। চেক করুন IF i != temp_2 তবে চেক করুন IF i != temp তবে arr[i] কে vc_1-এ push_back করুন এবং প্রিন্ট করতে থাকুন।

উদাহরণ

#include <bits/stdc++.h> 
using namespace std; 

void Minimize_root(int arr[], int size){ 
    vector<int> vec_1; 
    vector<int> vec_2; 
    vector<int> vec_3; 
    for (int i = 0; i < size; i++){ 
        if (arr[i] > 0){ 
            vec_2.push_back(i); 
        } 
        else if (arr[i] < 0){ 
            vec_3.push_back(i); 
        } 
    } 
    int vec_2_size = vec_2.size(); 
    int vec_3_size = vec_3.size(); 
    if(vec_2_size >= 2){ 
        if(vec_3_size >= 2){ 
            int max_val = INT_MIN; 
            int temp = -1; 
            int min_val = INT_MAX; 
            int temp_2 = -1; 
            int N_max = INT_MIN; 
            int N_temp = -1; 
            int N_min = INT_MAX; 
            int N_temp_2 = -1; 
            for (int i = 0; i < vec_2.size(); i++){ 
                if (arr[vec_2[i]] > max_val){ 
                    temp = vec_2[i]; 
                    max_val = arr[temp]; 
                } 
            } 
            for (int i = 0; i < vec_2.size(); i++){ 
                if (arr[vec_2[i]] < min_val){ 
                    if(vec_2[i] != temp){ 
                        temp_2 = vec_2[i]; 
                        min_val = arr[temp_2]; 
                    } 
                } 
            } 
            for (int i = 0; i < vec_3.size(); i++){ 
                if (abs(arr[vec_3[i]]) > N_max){ 
                    N_temp = vec_3[i]; 
                    N_max = abs(arr[N_temp]); 
                } 
            } 
            for (int i = 0; i < vec_3.size(); i++){ 
                if(abs(arr[vec_3[i]]) < N_min ){ 
                    if(vec_3[i] != N_temp){ 
                        N_temp_2 = vec_3[i]; 
                        N_min = abs(arr[N_temp_2]); 
                    } 
                } 
            } 
            double vec_2_data = -1.0 * (double)max_val / (double)min_val; 
            double vec_3_data = -1.0 * (double)N_max / (double)N_min; 
            if (vec_2_data < vec_3_data){ 
                vec_1.push_back(arr[temp_2]); 
                vec_1.push_back(arr[temp]); 
                for (int i = 0; i < size; i++){ 
                    if (i != temp_2 && i != temp){ 
                        vec_1.push_back(arr[i]); 
                    } 
                } 
            } 
            else{ 
                vec_1.push_back(arr[N_temp_2]); 
                vec_1.push_back(arr[N_temp]); 
                for (int i = 0; i < size; i++){ 
                    if (i != N_temp_2 && i != N_temp){ 
                        vec_1.push_back(arr[i]); 
                    } 
                } 
            } 
            for (int i = 0; i < vec_1.size(); i++){ 
                cout << vec_1[i] << " "; 
            } 
        } 
    } 
    else if(vec_2_size >= 2){ 
        int max_val = INT_MIN; 
        int temp = -1; 
        int min_val = INT_MAX; 
        int temp_2 = -1; 
        for (int i = 0; i < vec_2.size(); i++){ 
            if (arr[vec_2[i]] > max_val){ 
                temp = vec_2[i]; 
                max_val = arr[temp]; 
            } 
        } 
        for (int i = 0; i < vec_2.size(); i++){ 
            if (arr[vec_2[i]] < min_val){ 
                if(vec_2[i] != temp){ 
                    temp_2 = vec_2[i]; 
                    min_val = arr[temp_2]; 
                } 
            } 
        } 
        vec_1.push_back(arr[temp_2]); 
        vec_1.push_back(arr[temp]); 
        int i = 0; 
        i < size; i++; { 
            if(i != temp_2){ 
                if(i != temp){ 
                    vec_1.push_back(arr[i]); 
                } 
            } 
        } 
        for (int i = 0; i < vec_1.size(); i++){ 
            cout << vec_1[i] << " "; 
        } 
    } 
    else if(vec_3_size >= 2){ 
        int N_max = INT_MIN; 
        int temp = -1; 
        int N_min = INT_MAX; 
        int temp_2 = -1; 
        for (int i = 0; i < vec_3.size(); i++){ 
            if (abs(arr[vec_3[i]]) > N_max){ 
                temp = vec_3[i]; 
                N_max = abs(arr[temp]); 
            } 
        } 
        for (int i = 0; i < vec_3.size(); i++){ 
            if(abs(arr[vec_3[i]]) < N_min){ 
                if(vec_3[i] != temp){ 
                    temp_2 = vec_3[i]; 
                    N_min = abs(arr[temp_2]); 
                } 
            } 
        } 
        vec_1.push_back(arr[temp_2]); 
        vec_1.push_back(arr[temp]); 
        for (int i = 0; i < size; i++){ 
            if (i != temp_2){ 
                if(i != temp){ 
                    vec_1.push_back(arr[i]); 
                } 
            } 
        } 
        for (int i = 0; i < vec_1.size(); i++){ 
            cout << vec_1[i] << " "; 
        } 
    } 
    else { 
        cout<<"Not Possible"; 
    } 
} 

int main(){ 
    int arr[] = { 2, -1, 4, 9, -1, 10, -5}; 
    int size = sizeof(arr) / sizeof(arr[0]); 
    cout<<"Minimize the sum of roots of a given polynomial is: "; 
    Minimize_root(arr, size); 
    return 0; 
}

আউটপুট

উপরোক্ত কোডটি রান করলে নিচের আউটপুটটি জেনারেট হবে

Minimize the sum of roots of a given polynomial is: -1 -5 2 4 9 -1 10
  1. C++-এ পারফেক্ট বাইনারি ট্রি (Perfect Binary Tree) সকল নোডের যোগফল নির্ণয়

  2. C++-এ একটি স্ট্রিং সম-স্ট্রিং (sum-string) কিনা তা যাচাই করা

  3. C++-এ দেওয়া সংখ্যার ডিজিটগুলোর যোগফল বের করা

  4. পাইথনে দেওয়া জটিল রুট সহ পলিনোমিয়ালের রুট গণনা করা