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

【C++】A[i]

3つの整数型配列 A[]、B[]、C[] が与えられます。この記事の目的は、A[i] < B[j] < C[k] という条件を満たす要素の組み合わせ(トリプレット)が全部でいくつ存在するかを求めることです。3つの配列はいずれも同じ要素数 N を持ちます。

最も基本的な解法は、各配列を順番に走査しながら「A[i] < B[j] かつ B[j] < C[k]」という条件を判定し、条件を満たすたびにカウントを1ずつ増やしていくというものです。

具体例を使って理解していきましょう。

入力例と出力例

入力:

A[]={1,4,5} B={0,2,3} C={0,6,7}

出力: トリプレットの個数 − 4

説明:

A[i]<B[j]<C[k] を満たすトリプレット:
(1,2,6)、(1,2,7)、(1,3,6)、(1,3,7)。合計 4 個。

入力:

A[]={7,8,9} B={4,5,6} C={1,2,3}

出力: トリプレットの個数:0

説明:

A[i]<B[j]<C[k] を満たすトリプレットは存在しない

プログラムで使用するアプローチ

  • 同じ長さを持つ整数型配列 A[]、B[]、C[] をランダムな値で初期化して用意します。

  • 配列の長さを格納する変数 N を定義します。

  • 関数 countTriplets(int a[], int b[], int c[], int n) は、3つの配列と共通の長さ n を引数として受け取り、条件を満たすトリプレットの個数を返します。

  • 3重のループを使って各配列を走査します。

  • 最も外側のループは a[] 用の 0<=i<n、中間のループは b[] 用の 0<=j<n、最も内側のループは c[] 用の 0<=k<n となります。

  • a[i] < b[j] かつ b[j] < c[k] であるかを判定し、真であればカウントを1増やします。

  • すべてのループが完了した時点で、count には条件を満たすトリプレットの総数が格納されています。

  • count を結果として返します。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
int countTriplets(int a[],int b[],int c[], int n){
    int count = 0;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            for (int k = 0; k < n; k++){
                if(a[i]<b[j] && b[j]<c[k])
                    { count++; }
            }
        }
    }
    return count;
}
int main(){
    int A[]={ 1,2,3}; int B[]={ 2,3,2}; int C[]={ 4,3,1};
    int N=3; // 配列の長さ
    cout <<endl<< "Number of triplets : "<<countTriplets(A,B,C,N);
    return 0;
}

実行結果

上記のコードを実行すると、次の出力が得られます。

Number of triplets : 6
  1. C++でA[i] mod Kが最大になるような配列内の素数Kを見つける方法

    問題の概要n個の整数からなる配列Aが与えられたとします。この中から要素Kを見つけます。Kは素数であり、考えられるすべてのKの中でA[i] mod Kの値が最大になるものを選びます。条件を満たす数が見つからない場合は、-1を返します。例えば、A = [2, 10, 15, 7, 6, 8, 13] の場合、出力は13になります。この配列には3つの素数(2、7、13)が含まれており、それぞれの剰余の最大値は以下のようになります。K = 2 の場合:15 mod 2 = 1K = 7 の場合:6 mod 7 = 6K = 13 の場合:10 mod 13 = 10この中で最も大きいのは10なので、答

  2. C++で数を割り切る桁の個数を求める方法

    問題の概要ある整数が与えられたとき、その数を割り切る桁(各桁の数字)の個数を数える問題です。例として、数が 1012 の場合を考えてみましょう。この場合、答えは 3 となります。1、1、2 の3つの桁がそれぞれ 1012 を割り切れるためです。解法のアプローチこの問題を解くには、剰余演算(% 演算子)を使って数の各桁を1つずつ取り出し、元の数がその桁の値で割り切れるかどうかを判定します。割り切れる場合はカウンターを1つ増やします。なお、桁が 0 の場合は 0 で割ることができないため、その桁はスキップ(無視)します。アルゴリズムの流れ元の数のコピーを作成し、0 になるまでループを繰り返します。