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

C++の正方行列の対角線から最小および最大の要素を検索します


この問題では、サイズnXnの正方行列が与えられます。私たちのタスクは、正方行列の対角線から最小要素と最大要素を見つけることです。マトロックスの一次対角線と二次対角線の最小要素と最大要素を見つける必要があります。

問題を理解するために例を見てみましょう

入力

mat[][] = {
   {3, 4, 7},
   {5, 2, 1},
   {1, 8, 6}
}

出力

Smallest element in Primary Diagonal = 2
Largest element in Primary Diagonal = 6
Smallest element in Secondary Diagonal = 1
Largest element in Secondary Diagonal = 7

ソリューションアプローチ

この問題を解決する簡単な解決策は、ネストされたループを使用することです。一次対角で要素をチェックするために、 i =jを検討します。 。また、2次対角線については、 i + j =n -1を検討します。 。一次対角線と二次対角線の両方について、行列の最大要素と最小要素を見つけます。

ソリューションの動作を説明するプログラム

#include<iostream>
using namespace std;
void findMaxAndMinOfDiagonals(int mat[3][3], int n){
   if (n == 0)
      return;
   int pDiagMin = mat[0][0],
   pDiagMax = mat[0][0];
   int sDiagMin = mat[0][n - 1 ],
   sDiagMax = mat[0][n - 1];
   for (int i = 1; i < n; i++) {
      for (int j = 1; j < n; j++) {
         if (i == j){
            if (mat[i][j] < pDiagMin)
               pDiagMin = mat[i][j];
            if (mat[i][j] > pDiagMax)
            pDiagMax = mat[i][j];
         }
         if ((i + j) == (n - 1)) {
            if (mat[i][j] < sDiagMin){
               sDiagMin = mat[i][j];
            }
            if (mat[i][j] > sDiagMax)
               sDiagMax = mat[i][j];
         }
      }
   }
   cout<<("\nSmallest Element of Principal Diagonal : ")<<pDiagMin;
   cout<<("\nGreatest Element of Principal Diagonal : ")<<pDiagMax;
   cout<<("\nSmallest Element of Secondary Diagonal : ")<<sDiagMin;
   cout<<("\nGreatest Element of Secondary Diagonal : ")<<sDiagMax;
}
int main(){
   int mat[3][3] = {
      { 3, 4, 7 },
      { 0, 2, 1 },
      { 1, 7, 8 }
   };
   int n = sizeof(mat) / sizeof(mat[0]);
   findMaxAndMinOfDiagonals(mat, n);
}

出力

Smallest Element of Principal Diagonal : 2
Greatest Element of Principal Diagonal : 8
Smallest Element of Secondary Diagonal : 2
Greatest Element of Secondary Diagonal : 7

もう1つのより効果的な解決策は、主対角線のマットの両方のインデックスが同じであるという事実を使用して、ネストされたループを単一のループに減らすことです。

primary diagonal elements = mat[i][j].
Similarly, for secondary diagonal elements = mat[i][n - i - 1]

ソリューションの動作を説明するプログラム

#include<iostream>
using namespace std;
void findMaxAndMinOfDiagonals(int mat[3][3], int n){
   if (n == 0)
      return;
   int pDiagMin = mat[0][0],
   pDiagMax = mat[0][0];
   int sDiagMin = mat[0][n - 1 ],
   sDiagMax = mat[0][n - 1];
   for (int i = 1; i < n; i++) {
      if (mat[i][i] < pDiagMin)
         pDiagMin = mat[i][i];
      if (mat[i][i] > pDiagMax)
         pDiagMax = mat[i][i];
      if (mat[i][n - 1 - i] < sDiagMin)
         sDiagMin = mat[i][n - 1 - i];
      if (mat[i][n - 1 - i] > sDiagMax)
         sDiagMax = mat[i][n - 1 - i];
   }
   cout<<("\nSmallest Element of Principal Diagonal : ")<<pDiagMin;
   cout<<("\nGreatest Element of Principal Diagonal : ")<<pDiagMax;
   cout<<("\nSmallest Element of Secondary Diagonal : ")<<sDiagMin;
   cout<<("\nGreatest Element of Secondary Diagonal : ")<<sDiagMax;
}
int main(){
   int mat[3][3] = {
      { 3, 4, 7 },
      { 0, 2, 1 },
      { 1, 7, 8 }
   };
   int n = sizeof(mat) / sizeof(mat[0]);
   findMaxAndMinOfDiagonals(mat, n);
}

出力

Smallest Element of Principal Diagonal : 2
Greatest Element of Principal Diagonal : 8
Smallest Element of Secondary Diagonal : 1
Greatest Element of Secondary Diagonal : 7

  1. C++で対角行列とスカラー行列をチェックするプログラム

    行列M[r][c]が与えられた場合、「r」は行数を示し、「c」はr=cが正方行列を形成するような列数を示します。与えられた正方行列が対角であるかどうかを確認する必要があります およびスカラー 対角の場合、行列かどうか およびスカラー マトリックスを作成し、結果にyesを出力します。 対角行列 正方行列m[][]は、主対角を除く要素がゼロの場合にのみ対角行列になります。 下の図のように- ここで、赤の要素は主対角線であり、主対角線がゼロであることを除いてゼロ以外の残りの要素であり、対角行列になっています。 。 例 Input: m[3][3] = { {7, 0, 0},  

  2. 配列の最大要素を見つけるためのC++プログラム

    配列には複数の要素が含まれており、配列内の最大の要素は他の要素よりも大きい要素です。 たとえば。 5 1 7 2 4 上記の配列では、7が最大の要素であり、インデックス2にあります。 配列の最大の要素を見つけるプログラムは次のとおりです。 例 #include <iostream> using namespace std; int main() {    int a[] = {4, 9, 1, 3, 8};    int largest, i, pos;    largest = a[0