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