C++で行列の各行・各列の合計を求めるプログラム
このチュートリアルでは、与えられた行列について、各行と各列の合計を求めるC++プログラムを解説します。
ここでは、A×Bのサイズの行列が与えられたと仮定します。課題は、行列のすべての要素を走査し、各行および各列ごとの合計値を計算することです。
アルゴリズムの考え方
行の合計を求める場合は、外側のループで行番号を固定し、内側のループでその行の各要素を順番に加算していきます。1行分の合計を出力したら、合計用の変数を0にリセットして次の行へ進みます。
列の合計を求める場合は、ループの役割を入れ替えます。外側のループで列番号を固定し、内側のループでその列に属する各要素を加算します。
サンプルコード
#include <iostream>
using namespace std;
#define m 7
#define n 6
//各行の合計を計算
void calc_rsum(int arr[m][n]){
int i,j,sum = 0;
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
sum = sum + arr[i][j];
}
cout << "Sum of the row "<< i << ": " << sum << endl;
sum = 0;
}
}
//各列の合計を計算
void calc_csum(int arr[m][n]) {
int i,j,sum = 0;
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
sum = sum + arr[j][i];
}
cout << "Sum of the column "<< i << ": " << sum <<endl;
sum = 0;
}
}
int main() {
int i,j;
int arr[m][n];
int x = 1;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
arr[i][j] = x++;
calc_rsum(arr);
calc_csum(arr);
return 0;
}実行結果
Sum of the row 0: 10 Sum of the row 1: 34 Sum of the row 2: 58 Sum of the row 3: 82 Sum of the column 0: 40 Sum of the column 1: 44 Sum of the column 2: 48 Sum of the column 3: 52
コードの解説
このプログラムでは、まずmain関数内で7×6の2次元配列に1から順に連番を格納しています。その後、calc_rsum関数で各行の合計を、calc_csum関数で各列の合計をそれぞれ計算して出力します。
calc_rsum関数では、外側のループ変数iが行番号、内側のループ変数jが列番号を表し、arr[i][j]を加算することで行の合計を求めています。一方、calc_csum関数では添字を入れ替えてarr[j][i]を加算するため、列ごとの合計が計算されます。
また、1行・1列分の計算が終わるたびに変数sumを0にリセットしている点も重要です。これにより、次の行・列の合計を正しく求めることができます。計算量は行列の要素数に比例するO(M×N)となり、効率的な処理が可能です。
-
C++で行列内の合計が最大となる行を見つける方法
この問題では、N×N のサイズを持つ行列 mat[][] が与えられ、その中から要素の合計が最大となる行を見つけることが課題となります。問題を理解するための例入力mat[][] = { 8, 4, 1, 9 3, 5, 7, 9 2, 4, 6, 8 1, 2, 3, 4 }出力Row 2, sum 24説明各行の合計を計算すると以下のようになります。行1: 合計 = 8+4+1+9 = 22 行2: 合計 = 3+5+7+9 = 24 行3: 合計 = 2+4+6+8 = 20 行4: 合計 = 1+2+3+4 = 10この中で最も合計が大きいのは行2(合計
-
C++で二分木の最も深い葉ノードの値の合計を求める方法
はじめに二分木(バイナリツリー)が与えられたとき、その中で最も深い位置にある葉ノード(deepest leaves)の値の合計を求めることを考えます。例えば、次のような二分木があるとします。この場合、最も深い葉ノードは 7 と 4 であり、出力は 11 になります。解法のアプローチこの問題は、深さ優先探索(DFS)を用いて各レベルごとのノードの値の合計を記録し、最後に最大深度に対応する合計を取得することで解けます。具体的には、以下の手順に従います。レベルごとの合計を保持するマップ m と、最大深度を記録する変数 maxDepth を定義するノードとレベルを受け取る再帰メソッド solve()