C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で与えられた多項式の根の合計を最小化します


多項式の係数値を表す整数要素の配列が与えられます。配列のサイズは「n」、つまり配列内の要素の数になります。多項式の次数は常にn-1で始まります。これは、多項式列の最後に1つの定数値があるためです。タスクは、根の合計が最小化されるように、係数を他の多項式に置き換えることです。

このためのさまざまな入出力シナリオを見てみましょう-

− int 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になります。

− int 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にプッシュバックします。それ以外の場合、arr [i] <0、次にpuch_backiをvec_3に送信します。

    • vec_2とvec_3のサイズを計算します。

    • IF vec_2_size>=2およびIFvec_3_size>=2を確認し、ループFORをiから0までvec_2のサイズまで開始し、ループ内で、IFarr [vec_2 [i]]がmax_valより大きいことを確認し、tempをvec_2[i]に設定します。 max_valからarr[temp]。

    • vec_2のサイズになるまで、ループFORをiから0まで開始します。ループ内で、IF arr [vec_2[i]]がmin_val未満であることを確認します。IFvec_2[i]がtempと等しくないことを確認してから、temp_2をvec_2 [i]に設定し、min_valをarr [temp_2]

      に設定します。
    • vec_3のサイズになるまで、iから0までのループFORを開始します。ループ内で、IF abs(arr [vec_3 [i]])がN_maxより大きいことを確認してから、N_tempをvec_3 [i]に設定し、N_maxをabs(arr [N_temp])

      に設定します。
    • ループFORをiからvec_3サイズまで開始し、IF abs(arr [vec_3 [i]])がN_min未満であることを確認します。IFvec_3[i]がN_tempと等しくないことを確認してから、N_temp_2をvec_3[i]に設定します。 [N_temp_2])

    • IF vec_2_dataがvec_3_data未満であることを確認し、FORループ内でiから0まで配列のサイズになるまで確認し、IF iがtemp_2と等しくなく、iがtempと等しくないことを確認してから、arr[i]をvec_1にプッシュバックします。それ以外の場合は、iから0までのFORループ内で、配列のサイズまで、iがN_temp_2に等しくなく、iがN_tempに等しくないかどうかを確認してから、arr[i]をvec_1にプッシュバックします。

    • ループFORを開始して、vec_1をトラバースし、結果としてvec_1[i]を出力し続けます。

    • それ以外の場合は、vec_2_size> =2を確認してから、vec_2のサイズになるまでiから0までループFORを開始します。 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未満であることを確認します。IFvec_2[i]がtempに等しくないことを確認します。temp_2をvec_2[i]に設定し、min_valをarr[temp_2]に設定します。

    • 配列のサイズまで、iから0までループFORを開始します。ループ内で、IF iがtemp_2と等しくないことを確認してから、IFiがtempと等しくないことを確認してからpuch_backarr[i]をvec_1にチェックします。

    • ELSE IF、vec_3> =2次に、ループFORをiから0までvec_3サイズまで開始し、IF abs(arr [vec_3 [i]])がN_maxより大きいことを確認してから、tempをvec_3 [i]に設定し、N_maxをabs(arr [temp ])。

    • ループFORをiから0まで開始し、vec_3.size()が少なくなるまで、チェックよりもN_min未満のIFabs(arr [vec_3 [i]])をチェックします。 N_minからabs(arr [temp_2])。

    • 配列のサイズまで、iから0までループFORを開始します。 IF iがtemp_2と等しくないことを確認してから、IF iがtempと等しくないことを確認してから、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

  1. C++で与えられた完全な二分木のすべてのノードの合計を見つけます

    完全な二分木のレベル数を表す正の整数Lがあるとします。この完全な二分木のリーフノードには、1からnまでの番号が付けられています。ここで、nはリーフノードの数です。親ノードは子の合計です。私たちの仕事は、この完璧な二分木のすべてのノードの合計を出力するプログラムを書くことです。したがって、ツリーが以下のようになっている場合- したがって、合計は30です。 よく見ると、すべてのノードの合計を見つける必要があります。リーフノードは1からnまでの値を保持しているため、式n(n + 1)/2を使用してリーフノードの合計を取得できます。これは完全な二分木であるため、各レベルの合計は同じになります

  2. Pythonで与えられた複素数の根を持つ多項式の根を計算します

    多項式の根を計算するには、Python Numpyのpolynomial.polyroots()メソッドを使用します。このメソッドは、多項式の根の配列を返します。すべての根が実数である場合、outも実数であり、そうでない場合は複雑です。パラメータcは、多項式係数の1次元配列です。 ルート推定値は、コンパニオンマトリックスの固有値として取得されます。複素平面の原点から遠く離れたルートは、そのような値のべき級数の数値的不安定性のために大きな誤差を持つ可能性があります。多重度が1より大きい根は、そのような点の近くの系列の値が根の誤差に比較的鈍感であるため、より大きな誤差も示します。ニュートン法を数