-
C++でXより大きい数値を表す部分文字列の個数を数える方法
0から9までの数字のみで構成される文字列が与えられます。この文字列は1つの10進数を表しているとみなします。ここでの目的は、数値 X よりも大きな値を表す部分文字列がいくつあるかを求めることです。ただし、部分文字列の先頭が「0」で始まってはならないという条件があります。たとえば元の文字列が「2021」の場合、「02」「021」「0」のように先頭が0から始まる部分文字列は候補から除外されます。 この問題は、各開始位置の先頭文字をチェックするだけで効率的に解けます。先頭の文字が「0」以外であれば、そこから始まる部分文字列はすべて有効な候補になります。あとは stoi() を使って部分文字列を整数に
-
C++で[L, R]の範囲内にある「桁の合計が3で割り切れる」偶数の個数を求める方法
2つの整数 L と R が与えられ、範囲 [L, R] を定義します。この記事の目的は、L から R までの間に存在する偶数の中で、各桁の合計が3で割り切れる数の個数を求めることです。実現方法としては、L から R までのすべての偶数について桁の合計を計算し、その合計が3で割り切れる(sum % 3 == 0)場合にカウントを1つずつ増やしていきます。具体例で理解しましょう。例1入力 − L=10, R=20出力 − 範囲 [L, R] 内で桁の合計が3で割り切れる偶数の個数:2説明 − 10 から 20 の間の偶数は、10, 12, 14, 16, 18, 20 の6つです。このうち桁の合計
-
C++で配列内の要素の出現頻度をカウントする方法
はじめに重複した値を含む整数型の配列が与えられ、その中に存在する各要素(異なる値)の出現頻度を計算して結果を出力することが課題です。入力 − int arr[] = {1, 1, 2, 3, 4, 1, 2, 3}出力 −frequency of 1 is: 3 frequency of 2 is: 2 frequency of 3 is: 2 frequency of 4 is: 1入力 − int arr[] = {2, 3, 4, 1, 5}出力 −frequency of 1 is: 1 frequency of 2 is: 1 frequency of 3 is: 1 frequen
-
C++で文字列内の単語数をカウントする方法を解説
はじめに本記事では、スペース・改行文字(\n)・タブ文字(\t)を含む可能性のある文字列が与えられたとき、その文字列に含まれる単語の総数を計算し、結果を出力する方法を解説します。入出力例入力 − string str = welcome to\n tutorials point\t出力 − 文字列内の単語数 − 4説明 − 文字列には welcome、to、tutorials、point の4つの単語が含まれており、それ以外は単語間にあるスペース( )、改行文字(\n)、タブ文字(\t)です。入力 − string str = \nhonesty\t is the best policy出力
-
C++で文字列内の大文字・小文字・特殊文字・数字の出現回数をカウントする方法
文字列には、大文字・小文字のアルファベットだけでなく、特殊文字や数値が含まれている場合があります。本記事では、文字列内に含まれる各種文字(大文字・小文字)、特殊文字、数値の出現回数をそれぞれ集計する方法を解説します。 各文字の分類とASCIIコード 大文字:A〜Z。ASCIIコードは65〜90の範囲(65と90を含む)です。 小文字:a〜z。ASCIIコードは97〜122の範囲(97と122を含む)です。 数値:0〜9。ASCIIコードは48〜57の範囲(48と57を含む)です。 特殊文字:!、@、#、$、%、^、&、* など 入力例と出力例 入力:str = Tutori@lPo
-
C++で数値の合計ビット数をカウントする方法
はじめに 整数値(例えば num)が与えられたとき、まずその数値を2進数で表現し、続いてその数値が持つ有効なビットの総数を計算することを考えます。 入力 − int number = 50 出力 − 数値の合計ビット数は − 6 説明 − 数値50の2進表現は「110010」です。これを8桁で表すと、先頭に2つの0が付加されて「00110010」となります。したがって、この数値の有効ビット総数は6です。 入力 − int number = 10 出力 − 数値の合計ビット数は − 4 説明 − 数値10の2進表現は「1010」です。8桁で表すと、先頭に4つの0が付加されて「00001010」と
-
C++で整数のセットビット数をカウントする方法
はじめに 整数値 num が与えられたとき、その数をまず2進数に変換し、さらにセットビット(値が1になっているビット)の総数を求めることを考えます。 セットビットとは 2進数におけるセットビットとは、値が「1」であるビットのことです。整数を2進数で表現すると、0と1の組み合わせになりますが、コンピュータの世界ではこの「1」のことをセットビットと呼びます。 入力・出力の例 入力: int number = 50 出力: セットビットの総数は 3 説明: 50 の2進表現は 110010 です。8桁で表すと先頭に0が2つ追加されて 00110010 となります。したがって、セットビットの総数は 3
-
C++で指定範囲内のセットビット数をカウントする方法
整数値 num と、left(左端)および right(右端)で指定される範囲が与えられます。まず対象の数値を2進数表現に変換し、次に左端の桁から右端の桁まで順に走査して、指定された範囲内に存在するセットビットの個数を計算します。 2進数におけるセットビットとは、「1」で表されるビットのことです。整数値を2進数に変換すると、必ず0と1の組み合わせで表現されます。コンピュータの用語では、この「1」に相当するビットをセットビットと呼びます。 入出力例 入力: int number = 50, left = 2, right = 5出力: 範囲内のセットビットの合計数は 2 説明: 数値50の2進
-
C++で平面内に形成できる平行四辺形の数を数えるアルゴリズム
本記事の課題は、平面上に与えられた点集合から形成できる平行四辺形の個数を求めることです。平行四辺形とは、四角形の対辺が互いに平行であり、それに伴って対角も等しくなる四角形のことを指します。 入力 − int a[] = {0, 2, 5, 5, 2, 5, 2, 5, 2} int b[] = {0, 0, 1, 4, 3, 8, 7, 11, 10} 出力 − 平面内の平行四辺形の数 − 3 説明 − (x, y) 座標の点が与えられており、これらの点を組み合わせると、図のように 3 つの平行四辺形を形成できます。 入力 − a[] = {0, 3, 1, 4, 1, 5} b[] =
-
【C++】ビット単位AND演算の結果が奇数になるペアの総数を数える方法
整数型の配列が与えられたとき、配列内の値から組み合わせられるすべてのペアのうち、ビット単位のAND演算(&)を適用した結果が奇数になるペアの総数を求めるのがこの記事の課題です。 AND演算の真理値表 まず、AND演算の挙動を確認しましょう。真理値表は以下の通りです。両方の入力が1のときのみ、結果が1になります。 ABA & B000100010111 入力例と出力例 入力 − int arr[] = {2, 5, 1, 8, 9} 出力 − ビット単位ANDの結果が奇数となるペアの数: 3 説明 − 配列内のすべてのペアについてAND演算の結果を検証すると、次のようになります。 a1a
-
C++でビットごとのAND演算を使って偶数になるペアの数を数える方法
整数型の配列が与えられたとき、その配列の要素から作れるすべてのペアのうち、ビットごとのAND演算の結果が偶数になるペアの総数を求めるのがこの記事の課題です。 AND演算の真理値表 ABA & B 000 100 010 111 AND演算は、両方のビットが1であるときにだけ1を返します。したがって、偶数かどうかを決める最下位ビット(LSB)に注目すると、少なくとも一方が偶数であればANDの結果は必ず偶数になり、逆に奇数同士のペアだけが奇数の結果をもたらすことが分かります。この性質を利用すれば、全ペアを実際に調べることなく、効率よく答えを計算できます。 入力と出力の例 入力: i
-
C++でビット単位ORの結果が偶数になるペアを数える方法
整数型の配列が与えられたとき、その要素から作れるすべてのペアのうち、ビット単位のOR演算の結果が偶数になるペアが何組あるかを数えるのが本記事のテーマです。 結論から言うと、OR演算の結果が偶数になるのは、2つの数がどちらも偶数である場合だけです。この性質を利用すれば、全ペアを実際に計算しなくても、配列内の偶数の個数を数えて組み合わせの数を求めるだけで答えが得られます。 OR演算の真理値表 OR演算では、2つの入力のどちらか一方でも1であれば結果は1になります。 ABA∨B000101011111 なぜ「両方が偶数」のときだけ偶数になるのか 数の偶奇は最下位ビット(LSB)で決まります。OR演算
-
【C++】ビット単位ORが最大値以下になるペアの個数を数える方法
整数型の配列が与えられ、その要素から作成できるすべてのペアのうち、ペア同士のビット単位OR(論理和)を計算した結果が、そのペア内の最大値以下となる組み合わせの総数を求めるのが本記事のテーマです。 OR演算の真理値表 まず、OR演算の基本的な挙動を整理しておきましょう。 ABA ∨ B 000 101 011 111 OR演算では、どちらか一方のビットでも1であれば結果は1になります。この性質により、2つの異なる正整数のORは通常、両方の値以上になります。したがって「ORの結果が最大値以下」となるのは、片方の数値のセットビットがもう片方に完全に含まれている場合だけです。 入力と出力の例
-
C++でビット単位XORの結果が偶数になるペアをカウントする方法
整数型の配列が与えられ、その配列の要素から組み合わせられるすべてのペアのうち、ビット単位XOR演算の結果が偶数になるペアの総数を数えることが本記事の課題です。XOR演算の真理値表まず、XOR演算の基本的な挙動を理解するために、真理値表を確認しておきましょう。ABA XOR B000101011110この表から重要な性質が読み取れます。XOR演算の結果が奇数になるのは、片方の値が偶数でもう片方が奇数の場合だけです。両方とも偶数、または両方とも奇数の場合、XORの結果は必ず偶数になります。この性質こそが、効率的な解法の鍵となります。入力例と出力例入力 − int arr[] = {2, 8, 1,
-
C++でビット単位XORが奇数になるペアを数える方法
整数型の配列が与えられたとき、その配列の要素から組み合わせられるすべてのペアの中で、ビット単位XOR(排他的論理和)を計算した結果が奇数となるペアの総数を求めるのがこの問題の目的です。 XOR演算の真理値表 まずは、XOR演算の基本的な挙動を真理値表で確認しましょう。 ABA XOR B 000 101 011 110 この表からわかるように、XORの結果が1(奇数)になるのは、2つの値のうち片方だけが1(奇数)である場合です。言い換えると、「偶数と奇数」の組み合わせでのみXORは奇数になり、偶数同士や奇数同士の組み合わせでは必ず偶数になります。 入力例と出力例 入力 − int a
-
C++で指定された合計値になるペアの数を数える方法
整数型の配列と目標となる合計値(sum)が与えられたとき、配列の要素から作れるすべてのペアのうち、2つの要素の和が指定された合計値と一致するペアが何組あるかを数えるのがこの課題です。 具体例 例1 入力: int arr[] = {2, 8, 1, 5, 11}、sum = 13 出力: 合計が13になるペアの数 ― 2 説明: 配列から作れる全ペアとその和は次の表の通りです。和が13になるのは (2, 11) と (8, 5) の2組であることがわかります。 a1a2a1 + a2 2810 213 257 21113 819 8513 81119 156 11112 51116 例2(
-
C++でXORの結果が奇数になるペアの数を数える方法
はじめに 整数型の配列が与えられ、その配列の要素から組み合わせられるペアのうち、XOR(排他的論理和)演算の結果が奇数になるペアの総数を求めるのが本記事の課題です。 XOR演算の真理値表 ABA XOR B000101011110 この真理値表から分かるように、XORの結果が「1」になるのは2つの値が異なる場合だけです。整数の最下位ビットに着目すると、偶数の最下位ビットは0、奇数の最下位ビットは1であるため、XORの結果が奇数になるのは「片方が偶数でもう片方が奇数」の組み合わせだけであることが分かります。したがって、答えは「偶数の個数 × 奇数の個数」で求められます。 入出力の例 入力 − i
-
【C++】LからRの範囲に含まれる偶数と奇数の個数を数える方法
整数値の範囲 L から R が与えられたとき、その範囲内に含まれる偶数と奇数がそれぞれ何個あるのかを求めるのがこの課題です。 入出力の例 入力: L = 7、R = 17 出力: 範囲 L から R に含まれる偶数の個数は 5、奇数の個数は 6 入力: L = 1、R = 10 出力: 範囲 L から R に含まれる偶数の個数は 5、奇数の個数は 5 解法の考え方 範囲の始点 L と終点 R を受け取ります。 L と R の値を関数に渡して偶数の個数を数え、その戻り値をもとに奇数の個数を計算します。 i を L から R まで 1 ずつ増やしながら FOR ループを回します。 ループの中
-
C++で配列内の「x < y」となるペア(x, y)の個数を数える方法
問題の概要整数型の配列が与えられます。この配列の値を組み合わせて作成できるペア(x, y)のうち、x の値が y より小さいという条件を満たすペアの総数を求めるのが本記事の課題です。入力: int arr[] = { 2, 4, 3, 1 }出力: x < y となる配列内のペア(x, y)の個数 ― 6説明入力配列 { 2, 4, 3, 1 } から作れるすべての順序付きペアを検証すると、結果は次のようになります。XYX < Y24成立23成立21不成立43不成立41不成立42不成立32不成立12成立34成立14成立31不成立13不成立この表から、条件を満たすペアは全部で 6 個
-
【C++】1からaと1からbのペアのうち、合計がNで割り切れる組の数を数える方法
整数 a、b、n が与えられます。ここで x は 1 以上 a 以下の整数、y は 1 以上 b 以下の整数とし、これらを組み合わせて作られるすべてのペア (x, y) のうち、合計値 (x + y) が n で割り切れるペアの総数を求めるのが今回の課題です。 入出力の例 例1 入力: int a = 2, b = 3, n = 2 出力: 合計がNで割り切れるペアの数 ― 3 説明: まず、1 から a(=2)までの整数は「1, 2」です。 次に、1 から b(=3)までの整数は「1, 2, 3」です。 作成できるペアは (1,1)、(1,2)、(1,3)、(2,1)、(2,2)、(2,