Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 주어진 다항식의 근의 합 최소화

<시간/>

다항식의 계수 값을 나타내는 정수 요소 배열이 제공됩니다. 배열의 크기는 'n', 즉 배열의 요소 수입니다. 다항식 시리즈의 끝에 하나의 상수 값이 있기 때문에 다항식의 차수는 항상 n-1로 시작합니다. 작업은 근의 합이 최소화되는 방식으로 계수를 다른 다항식으로 바꾸는 것입니다.

이에 대한 다양한 입력 출력 시나리오를 살펴보겠습니다. -

에서 - 정수 arr[] ={ 2, -1, 4, 9, -1, 10, -5}

밖으로 − 주어진 다항식의 근의 합을 최소화:-1 -5 2 4 9 -1 10

설명 − 7개의 요소를 포함하는 정수 배열이 제공됩니다. 즉, 다항식 거듭제곱은 6이 됩니다. 따라서 최소 출력을 다음과 같이 얻을 수 있습니다. -1 * x^6 - 5 * x^5 + 2 * x^4 + 4 * x^3 + 9 * x^2 - 1 * x^1 + 10근의 최소 합은 -5와 1입니다.

에서 - 정수 arr[] ={3, -2, -1, 4}

밖으로 − 주어진 다항식의 근의 합을 최소화:-1 -2 3 4

설명 − 7개의 요소를 포함하는 정수 배열이 제공됩니다. 즉, 다항식 거듭제곱은 6이 됩니다. 따라서 최소 출력을 다음과 같이 얻을 수 있습니다. -1 * x^3 - 2 * x^2 + 3 * x^1 + 4이것은 근의 최소 합은 -1입니다.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

  • 정수 요소의 배열을 입력하고 배열의 크기를 계산합니다. 추가 처리를 위해 데이터를 함수에 전달합니다.

  • Minimize_root(arr, size)

    함수 내부
    • 정수형 벡터형 변수를 vec_1, vec_2, vec_3으로 선언합니다.

    • 배열의 크기까지 i에서 0까지 루프 FOR를 시작합니다. 루프 내에서 IF arr[i]> 0을 확인한 다음 i를 vec_2로 push_back합니다. 그렇지 않으면 IF, arr[i] <0 다음 puch_back i에서 vec_3.

    • vec_2와 vec_3의 크기를 계산합니다.

    • IF vec_2_size>=2 AND IF vec_3_size>=2를 확인한 다음 vec_2의 크기까지 루프 FOR를 i에서 0으로 시작하고 루프 내부에서 max_val보다 큰 IFarr[vec_2[i]]를 확인한 다음 temp를 vec_2[i]로 설정하고 max_val에서 arr[temp]로.

    • vec_2의 크기까지 i에서 0까지 루프 FOR를 시작합니다. 루프 내에서 IF arr[vec_2[i]]가 min_val보다 작은지 확인하십시오.

    • vec_3의 크기까지 i에서 0까지 루프 FOR를 시작합니다. 루프 내에서 N_max보다 큰 IF abs(arr[vec_3[i]])를 확인한 다음 N_temp를 vec_3[i]로 설정하고 N_max를 abs(arr[N_temp])로 설정합니다.

    • 루프 FOR를 i에서 0까지 시작하여 vec_3 크기까지 IF abs(arr[vec_3[i]])가 N_min보다 작은지 확인하고 IFvec_3[i]가 N_temp와 같지 않은지 확인한 다음 N_temp_2를 vec_3[i]로 설정하고 N_min =abs(arr) [N_temp_2])

    • vec_2_data가 vec_3_data보다 작은지 확인한 다음 FOR 루프 내부에서 i에서 0으로 배열의 크기까지 확인하고 IF i가 temp_2와 같지 않고 temp와 같지 않은지 확인한 다음 arr[i]를 vec_1로 푸시합니다. ELSE, FOR 루프 내에서 i에서 0까지 배열의 크기까지, i not equal to N_temp_2 AND i not equal to N_temp then push_back arr[i] to vec_1.

    • 루프 FOR를 시작하여 vec_1을 트래버스하고 결과적으로 vec_1[i]을 계속 인쇄합니다.

    • ELSE IF, vec_2_size>=2를 확인한 다음 vec_2의 크기까지 i에서 0까지 루프 FOR를 시작합니다. IF arr[vec_2[i]]가 max_val보다 큰지 확인한 다음 temp를 vec_2[i]로, max_val을 arr[temp]로 설정합니다.

    • vec_2의 크기보다 작아질 때까지 i에서 0까지 루프 FOR를 시작합니다. 루프 내부에서 IF arr[vec_2[i]]가 min_val보다 작은지 확인하십시오.

    • 배열의 크기까지 i에서 0까지 FOR 루프를 시작합니다. 루프 내에서 IF i not equal to temp_2를 확인한 다음 IF i not equal to temp, puch_back arr[i] to vec_1.

    • ELSE IF, vec_3>=2 그런 다음 vec_3 크기까지 i에서 0까지 루프를 시작하고 N_max보다 큰 IF abs(arr[vec_3[i]])를 확인한 다음 temp를 vec_3[i]로 설정하고 N_max를 abs(arr[temp]로 설정합니다. ]).

    • vec_3.size()보다 작아질 때까지 루프 FOR를 i에서 0으로 시작하고 IF vec_3[i]가 temp_2를 vec_3[i]로 설정하는 것보다 temp와 같지 않음을 확인하는 것보다 N_min보다 작은 IFabs(arr[vec_3[i]])를 확인합니다. 및 N_min에서 abs(arr[temp_2])로.

    • 배열의 크기까지 i에서 0까지 FOR 루프를 시작합니다. i not equal to temp_2를 확인한 다음 IF i not equal to temp를 확인한 다음 push_back arr[i]를 vc_1로 지정하고 인쇄를 계속하십시오.

예시

#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; //max_val
      int temp = -1; //temp
      int min_val = INT_MAX; //min_val
      int temp_2 = -1; //temp_2
      int N_max = INT_MIN; // N_max
      int N_temp = -1; // N_temp
      int N_min = INT_MAX; //N_min
      int N_temp_2 = -1; //N_temp_2

      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