C++でarr[i]*arr[j] > arr[i]+arr[j]を満たすペア(i, j)の個数を数える方法
正の整数からなる長さnの配列が与えられます。この問題の目的は、arr[i]*arr[j] > arr[i]+arr[j] かつ 0≦i<j<n を満たす順序付きペア(i, j)の個数を数えることです。ここで、nは配列内の要素数を表します。
2つのforループを使って配列を走査し、各ペアについて調べていきます。それぞれのペアに対してarr[i]とarr[j]の和と積を計算し、積が和より大きければカウントを1つ増やします。
具体例で確認してみましょう。
入力 − Arr[]= { 1,1,2,3 } N=4
出力 − ペアの個数 − 1
説明 − 条件を満たす唯一のペアは(2,3)です。
2*3=6 > 2+3=5
入力 − Arr[]= { 2,2,2 } N=3
出力 − ペアの個数 − 0
説明 − 2*2も2+2もどちらも4になるため、積が和より大きくなるペアは存在しません。
本プログラムで使用するアプローチ
正の整数で初期化された整数型配列arr[]を用意します。
Arr[]の長さを格納する変数nを定義します。
関数countPairs(int arr[], int n)は、配列とその長さを引数として受け取り、積が和より大きくなるペアの個数を出力します。
ペアを構成する各要素について、2つのforループを使って配列を走査します。
外側のループは0≦i<n−1、内側のループはi<j<nの範囲で繰り返します。
arr[i]*arr[j]>arr[i]+arr[j]という条件を判定し、真であればカウントを増やします。
すべてのループが終了した時点で、countには積が和より大きいペアの総数が格納されています。
結果としてcountを返します。
コード例
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
int countPairs(int arr[], int n){
int count=0;
int sum=0;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(arr[i]*arr[j]>arr[i]+arr[j]) //条件判定
{ count++; }
}
}
return count;
}
int main(){
int arr[] = { 1,2,3,2 };
int len = sizeof(arr) / sizeof(int);
cout<<"Count of number of pairs :"<<countPairs(arr, len);
return 0;
}出力
上記のコードを実行すると、次の出力が得られます −
Count of number of pairs :2
-
C++で数を割り切る桁の個数を求める方法
問題の概要ある整数が与えられたとき、その数を割り切る桁(各桁の数字)の個数を数える問題です。例として、数が 1012 の場合を考えてみましょう。この場合、答えは 3 となります。1、1、2 の3つの桁がそれぞれ 1012 を割り切れるためです。解法のアプローチこの問題を解くには、剰余演算(% 演算子)を使って数の各桁を1つずつ取り出し、元の数がその桁の値で割り切れるかどうかを判定します。割り切れる場合はカウンターを1つ増やします。なお、桁が 0 の場合は 0 で割ることができないため、その桁はスキップ(無視)します。アルゴリズムの流れ元の数のコピーを作成し、0 になるまでループを繰り返します。
-
C++でXORが0になる配列内のペアの数を求める方法
n個の要素を含む配列が与えられたとき、XOR(排他的論理和)の計算結果が0になるペアの数を求めることを考えます。ペア(x, y)のXORが0になるのは、x = y が成り立つ場合、すなわち2つの値が等しいときだけです。これは「同じ数値同士のXORは必ず0になる」というビット演算の基本的な性質によるものです。解法のアプローチこの問題は、次の手順で解くことができます。まず、配列を昇順にソートします。ソート後は同じ値どうしが隣り合って並ぶため、連続する2つの要素を比較し、等しければカウントを1つ増やします。すべての要素が同じ値である場合、末尾側のペアがカウントから漏れる可能性があります。そこで、配列