C言語で1つ目の配列の最大値と2つ目の配列の最小値の積を求める方法
問題概要
それぞれ n1 個と n2 個の要素を持つ2つの整数型配列 arr1[] と arr2[] が与えられたとき、「1つ目の配列 arr1[] の最大要素」と「2つ目の配列 arr2[] の最小要素」を掛け合わせた積を求めるのが本記事のテーマです。
例えば、arr1[] = {5, 1, 6, 8, 9} なら最大値は 9、arr2[] = {2, 9, 8, 5, 3} なら最小値は 2 となります。したがって答えは 9 × 2 = 18 です。この計算を行うC言語のプログラムを作成していきましょう。
入出力例
入力例1
arr1[] = {6, 2, 5, 4, 1}
arr2[] = {3, 7, 5, 9, 6}
出力例1
18
説明:
MAX(arr1) * MIN(arr2) → 6 * 3 = 18
入力例2
arr1[] = { 2, 3, 9, 11, 1 }
arr2[] = { 5, 4, 2, 6, 9 }
出力例2
22
説明:
MAX(arr1) * MIN(arr2) → 11 * 2 = 22
解決のためのアプローチ
この問題は、以下の手順でシンプルに解くことができます。
- 2つの配列 arr1 と arr2 を入力として受け取ります。
- 両方の配列を昇順にソートします。
- ソート後の arr1 の最後の要素(=最大値)と、arr2 の先頭の要素(=最小値)を掛け合わせます。
- その積を結果として返します。
アルゴリズム
Start
In function int sortarr(int arr[], int n)
Step 1→ 変数 temp を宣言・初期化する
Step 2→ i = 0 から i < n-1 まで ++i で繰り返す
For j = i+1 から j<n まで j++ で繰り返す
If arr[i] > arr[j] ならば、
temp に arr[i] を代入
arr[i] に arr[j] を代入
arr[j] に temp を代入
In Function int minMaxProduct(int arr1[], int arr2[], int n1, int n2)
Step 1→ sortarr(arr1, n1) を呼び出す
Step 2→ sortarr(arr2, n2) を呼び出す
Step 3→ (arr1[n1 - 1] * arr2[0]) を返す
In Function int main()
Step 1→ arr1[] = { 2, 3, 9, 11, 1 } を宣言・初期化する
Step 2→ arr2[] = { 5, 4, 2, 6, 9 } を宣言・初期化する
Step 3→ n1, n2 を宣言し、各配列のサイズで初期化する
Step 4→ minMaxProduct(arr1, arr2, n1, n2) の結果を出力する
Stop
C言語による実装例
#include <stdio.h>
int sortarr(int arr[], int n){
int temp;
for (int i = 0; i < n-1; ++i){
for(int j = i+1; j<n; j++){
if(arr[i]> arr[j]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return 0;
}
int minMaxProduct(int arr1[], int arr2[], int n1, int n2){
// 最大値と最小値を得るために配列をソートする
sortarr(arr1, n1);
sortarr(arr2, n2);
// 最大値と最小値の積を返す
return arr1[n1 - 1] * arr2[0];
}
int main(){
int arr1[] = { 2, 3, 9, 11, 1 };
int arr2[] = { 5, 4, 2, 6, 9 };
int n1 = sizeof(arr1) / sizeof(arr1[0]);
int n2 = sizeof(arr2) / sizeof(arr2[0]);
printf("%d\n",minMaxProduct (arr1, arr2, n1, n2));
return 0;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
22
補足:計算量について
この実装では選択ソート(バブルソート的な交換法)を使用しているため、時間計算量は O(n1² + n2²) となります。より大きな配列を扱う場合は、qsort 関数など O(n log n) の効率的なソートを利用するとよいでしょう。また、ソートせずに各配列を一度だけ走査して最大値・最小値を直接求める方法(O(n1 + n2))もあり、実務ではこちらの方が高速です。
-
C言語で配列内の要素の最初と最後のインデックス間の最大差を求める方法
サイズNの整数配列が与えられ、その要素はランダムな順序で並んでいます。この課題では、配列内のある要素について「最初に出現するインデックス」と「最後に出現するインデックス」の差を求め、その差が最大となる値を見つけます。つまり、配列内に2回以上出現する数値の中から、インデックス間の距離が最も大きくなるものを探し出すことになります。条件を満たすペアが複数存在する場合は、その中で最大の差を答えとして返します。 入力例と出力例 入力 Arr[] = { 2,1,3,1,3,2,5,5 } 出力 − 配列内の要素の最初と最後のインデックス間の最大差 − 5 説明 − 各要素のペアとそのインデックス間の差は
-
C言語で配列の全要素の積を求めるプログラム
n個の要素を含む配列 arr[n] が与えられたとき、その配列内のすべての要素の積を求めることが課題となります。例えば、7つの要素からなる配列 arr[7] の場合、積は以下のように計算されます。例入力: arr[] = { 10, 20, 3, 4, 8 } 出力: 19200 説明: 10 × 20 × 3 × 4 × 8 = 19200 入力: arr[] = { 1, 2, 3, 4, 3, 2, 1 } 出力: 144解き方のアプローチ配列を入力として受け取る。配列のサイズを求める。配列を反復処理しながら、各要素を掛け合わせる。結果を表示する。アルゴリズム開始 関数 int pro