-
C++で2つの配列から桁の合計が等しい異なるペアをカウントする方法
2つの整数型配列 arr_1[] と arr_2[] が与えられたとき、「桁の合計(各桁の数字を足し合わせた値)が等しくなる異なるペア」の個数を求めるのがこの記事の課題です。ペアを作る際には、arr_1[] から1つの値を、arr_2[] からもう1つの値を選び、選んだ2つの値の桁の合計が一致していなければなりません。 配列とは、同じ型の要素を固定サイズで連続的に格納できるデータ構造の一種です。データの集合をまとめて扱うために使われますが、「同じ型の変数が並んだ集合」と捉えると、より理解しやすくなります。 具体例 入力 − int arr_1[] = {1, 22, 42, 17}int a
-
【C++】他のすべての要素の合計を割り切る配列要素の個数を数える方法
本記事では、整数値からなる配列 arr[] が与えられたとき、「その要素自身を除いた残りの要素の合計を割り切れる要素」が配列の中にいくつあるかを求める方法を解説します。配列とは、同じ型の要素を固定長で連続的に格納できるデータ構造です。複数のデータをまとめて扱うことができ、同じ型の変数の集合として考えると理解しやすくなります。具体例入力: int arr_1[] = {9, 6, 3}出力: count is 3説明: 要素 9 に対しては残りの合計 6+3 = 9 が 9 で割り切れ、要素 6 に対しては 9+3 = 12 が 6 で割り切れ、要素 3 に対しては 9+6 = 15 が 3 で
-
C++で配列要素の積の約数の個数を数える方法
整数型の配列 arr[] が与えられたとき、そのすべての要素を掛け合わせた値の約数がいくつあるかを求めるのが本記事のテーマです。 配列とは、同じ型の要素を固定サイズで連続的に格納できるデータ構造の一種です。複数のデータをひとまとめに扱うために使われ、「同じ型の変数の集まり」として考えると理解しやすくなります。 具体例 入力: int arr[] = {2, 3} 出力: count is 4 解説: 配列の積は 2 × 3 = 6 です。6 の約数は 1, 2, 3, 6 の 4 個なので、答えは 4 となります。 入力: int arr[] = {2, 3, 5} 出力: count is
-
C++で絶対差がKを超えない配列の最大要素数をカウントする方法
本記事では、任意のサイズの整数要素からなる配列 arr[] と正整数 k が与えられたとき、互いの絶対差が k 以内に収まる要素を数え上げ、その最大数を求める方法を解説します。 配列とは、同じ型の要素を固定サイズで連続的に格納できるデータ構造の一種です。複数のデータをひとまとめに扱うことができ、同じ型の変数の集合として捉えると、その仕組みをより直感的に理解できます。 入出力例 入力 − int arr[] = {2, 3, 6, 12, 14}, k = 5出力 − カウント: 3 解説 − 絶対差が k(この例では5)を超えない組み合わせは、(2, 3)、(2, 6)、(3, 6) であり
-
C++で二分探索木(BST)の指定範囲内にあるノード数をカウントする方法
本記事では、ノードで構成される二分探索木(BST)とある範囲が与えられたとき、その範囲に含まれるノードの個数を計算して結果を表示する方法を解説します。二分探索木(BST)とは二分探索木(Binary Search Tree:BST)とは、すべてのノードが以下の性質を満たす木構造のことです。あるノードの左部分木に含まれるキーは、その親ノードのキー以下である。あるノードの右部分木に含まれるキーは、その親ノードのキー以上である。つまり、BSTはすべての部分木を「左部分木」と「右部分木」の2つのセグメントに分割でき、次のように定義できます。left_subtree(キー) ≤ node(キー) ≤ r
-
C++で数値を除算した際の小数点以下の桁数を数える方法
2つの整数 num1 と num2 が与えられたとき、num1 を num2 で除算し、その結果の小数点以下の桁数を求めるのが本記事のテーマです。具体例入力 − num1 = 2, num2 = 5出力 − count is 1説明 − 2 を 5 で割ると 2/5 = 0.4 となり、小数点以下の桁数は 1 桁であるため、count は 1 になります。入力 − num1 = 2, num2 = 0出力 − Floating point exception (core dumped)説明 − 任意の数を 0 で割るとエラーが発生し、プログラムは異常終了します。実装の際はゼロ除算への対処が必要
-
C++でLEDの点灯変化をカウントし、数字を1つずつ表示する方法
正の整数 num が与えられ、LEDライトを1つずつ点灯させて数字を表示する際の「変化回数」を求めるのが本記事の課題です。ここでは、初期状態ではすべてのLEDが消灯しており、文字列の値に基づいて順番に点灯していくものと仮定します。この問題を解くには、まず「7セグメントディスプレイ」の構造と動作原理を理解する必要があります。7セグメントディスプレイとは7セグメントディスプレイは、画像・テキスト・10進数の数字などを表示できる出力表示装置で、より複雑なドットマトリクスディスプレイに代わる表示手段として広く活用されています。デジタル時計や簡易電卓、電子メーターなど、数値情報を表示するさまざまな電子機
-
C++で2つの文字列に共通する部分列の数を求める方法
本記事では、文字 str1 と str2 の2つの文字列が与えられたとき、両方の文字列に共通する部分列(サブシーケンス)の数を計算する方法を解説します。ここでは動的計画法(Dynamic Programming)を用いて問題を解きます。そのため、まず動的計画法とは何か、どのような問題に適用できるのかを理解しておきましょう。動的計画法とは動的計画法は、問題をより小さな部分問題へと分割していくという点で「分割統治法」と似ています。しかし、分割統治法と異なるのは、各部分問題を独立に解かないという点です。むしろ、小さな部分問題の結果を記憶しておき、類似した、あるいは重複する部分問題に対してその結果を再
-
C++で文字列内の子音をカウントする方法(反復処理と再帰処理の2つのアプローチ)
任意の長さの文字列 str が与えられ、その文字列に含まれる子音の数を「反復処理(イテレーション)」と「再帰処理」の2つの方法で求めることが課題です。子音とは子音とは母音以外のアルファベットのことで、a、i、e、o、u を除くすべてのアルファベットが子音とみなされます。したがって、このプログラムでは、文字列からこれら5つの母音以外のアルファベットを数え上げる必要があります。再帰と反復の違い再帰と反復は、どちらも一連の命令を繰り返し実行する仕組みです。再帰とは、関数内の処理が自分自身を繰り返し呼び出すことを指します。一方、反復とは、制御条件が偽(false)になるまでループが繰り返し実行されるこ
-
【C++】ベクトル内のターゲット値や条件に一致する要素数をカウントする方法
ベクトル(vector)が与えられたとき、その中からターゲット値や特定の条件に一致する要素の個数を求めるのが本記事の目的です。 ベクトルとは、サイズを動的に変更できるシーケンスコンテナの一種です。コンテナとは同一の型のデータを保持するオブジェクトのことであり、シーケンスコンテナは要素を厳密に線形の順序で格納します。 ベクトルは連続したメモリ領域に要素を格納し、添字演算子 [] を使って任意の要素へ直接アクセスすることができます。配列と異なり、ベクトルは実行時に必要に応じて縮小・拡張が可能で、記憶域の管理は自動的に行われます。 この実行時の伸縮機能を実現するために、ベクトルコンテナは将来の拡張に
-
C++で二分木の半ノード(ハーフノード)を数える方法【反復・再帰の両アプローチ】
本記事では、二分木(バイナリツリー)に含まれる「半ノード(ハーフノード)」の数を、反復処理と再帰処理の2つのアプローチで求める方法を解説します。半ノードとは?半ノードとは、子を1つだけ持ち、もう片方の子がNULL(空)になっているノードのことです。なお、子をまったく持たない葉ノードは半ノードには含まれない点に注意してください。二分木はデータの格納に使われる特殊なデータ構造です。各ノードが最大2つの子を持つという制約があり、ソート済み配列並みの高速な検索と、連結リスト並みの高速な挿入・削除の両方を実現できるというメリットがあります。二分木の基本的な構造は以下の通りです。具体例入力:出力: カウン
-
C++で二分木の完全ノードを数える方法(反復法と再帰法)
本記事では、二分木に含まれる「完全ノード(フルノード)」の数を、反復法と再帰法の2つのアプローチで求める方法を解説します。完全ノードとは、左と右の子を両方持ち、どちらの子もNULLでないノードのことです。つまり、ちょうど2つの子を持つノードのみが完全ノードとして扱われます。 二分木はデータの格納に用いられる特殊なデータ構造です。「各ノードが最大2つの子までしか持てない」という制約があり、ソート済み配列並みの高速な検索性能と、連結リスト並みの高速な挿入・削除性能を兼ね備えているのが特徴です。なお、1つ以上の子を持つ非葉ノードは「親ノード」とも呼ばれます。 二分木の基本構造は以下の通りです。
-
C++で0と1のみからなる長さNの2進文字列の総数を求める方法
ある整数 num が与えられたとき、0と1のみで構成される長さ num の2進文字列が何通り作れるかを求めるのが本記事の課題です。 2進数(バイナリ)は数値表現の手法のひとつで、デジタルシステムにおいて最も広く利用されています。2進数は、「開く/閉じる」の2状態しか持たないスイッチのように、動作状態が2つしかないデバイスで表現できる量を扱うために用いられます。 2進数体系で使われる記号は 0 と 1 の2種類だけです。2進文字列とは、これらの2進値(0または1)のみから構成される文字列のことを指します。 例 入力 − num = 3 出力 − count is 8 説明 − 長さ3で作れる2
-
C++で数値に1を加算した際に変化するビット数をカウントする方法
ある整数 num が与えられたとき、その数に 1 を加算した結果、何個のビットが変化するかを求めるのが本記事の課題です。2進表現とは、数値を 0 と 1 の並びで表したものです。2進変換にはさまざまな方法がありますが、その一つとして、数値を 2 で割った余りを順に調べていく方法があります。余りが 0 以外であればその桁のビットは 1 に、0 であれば 0 に設定されます。ビットの加算表0 + 1 = 1 1 + 0 = 1 0 + 0 = 0 1 + 1 = 10(1ビットの繰り上がり)具体例入力: num = 10 出力: count is : 1説明: 10 の2進表現は「1010」です。
-
C++で数列 1, 4, 15, 24, 45, 60, 92… のN番目の項を求めるプログラム
この問題では、整数 N が与えられます。求めるのは、C++ を使って数列「1, 4, 15, 24, 45, 60, 92, 112 …」の N 番目の項を計算するプログラムです。 問題の概要 与えられた数列の第 N 項を求めることが課題です。 対象となる数列:1, 4, 15, 24, 45, 60, 92, 112 …(N 項) まずは、この数列の一般項(一般式)を見つけるところから始めましょう。 入出力例 入力:N = 6 出力:60 解き方のアプローチ この数列の一般項は、N が偶数か奇数かによって変わります。一見すると規則性をつかみにくい数列ですが、「奇数番目」と「偶数番目」という2
-
C++で数列「2、4、3、4、15…」のN番目の項を求めるプログラム
この記事では、整数Nが与えられたときに、C++を使って数列「2, 4, 3, 4, 15, …」のN番目の項を求めるプログラムを作成します。問題の説明対象となる数列は以下の通りです。2, 4, 3, 4, 15, 0, 14, 16 ....(N項まで)この数列の一般項(第n項)を表す公式を見つけ出し、それをもとに任意のN番目の値を計算するのが目的です。まず、具体例を使って問題を確認しましょう。入力:N = 9出力:9解決のアプローチこの数列の値の増加傾向を観察すると、増加は線形的であり、平方数などの特別なパターンは含まれていません。しかし、値は他の要因にも依存していることがわかります。たとえ
-
C++で数列 3, 5, 21, 51, 95, … のN番目の項を求めるプログラム
この記事では、数値Nが与えられたときに、C++を使って数列 3, 5, 21, 51, 95, … のN番目の項を求めるプログラムの作成方法を解説します。 問題の説明 次の数列のN番目の項を求めるのが課題です。 3, 5, 21, 51, 95, 153, …(N項まで) この数列は各項の増加パターンから、二次方程式(二次関数)に従うことがわかります。したがって、まず数列の一般項の公式を導き出す必要があります。 入出力例 入力: N = 6 出力: 153 解決アプローチ この問題を解くには、数列の一般項(第n項)の公式を求めます。この数列の一般項は、以下の二次式で表されます。 Tn = 7
-
C++で数列「3, 6, 18, 24, …」のN番目の項を求めるプログラム
この記事では、与えられた数値Nに対して、数列「3, 6, 18, 24, …」のN番目の項をC++で求めるプログラムを紹介します。問題の説明対象となる数列は以下のとおりです。3, 6, 18, 24, 45, 54, 84 …(N項まで)この数列の一般項(第N項を求める式)を見つけ出し、任意のNに対してその値を計算するのが課題です。入力・出力例入力: N = 10出力: 150解法のアプローチ数列の一般項を求めるには、まず数列を注意深く観察し、規則性を探します。すべての項に3が共通していることに気づきますが、それだけでは一般化にはつながりません。そこで、各項をその項番号n(1, 2, 3, …
-
C++で数列 3, 12, 29, 54, 86, 128, 177, 234, … のN番目の項を求めるプログラム
このチュートリアルでは、数列 3, 12, 29, 54, 86, 128, 177, 234, … のN番目の項を求めるC++プログラムについて解説します。ここでは、ある数値が与えられ、その位置に対応する数列の項を求めることが課題となります。数列の一般項まず、この数列の規則性を確認しましょう。隣接する項同士の差は次のようになっています。12 − 3 = 929 − 12 = 1754 − 29 = 25差が一定ではなく、等差数列(9, 17, 25, …)をなしていることから、これは二次式で表せる数列であると分かります。実際、N番目の項は次の一般項で表されます。a(n) = 4n² − 3n
-
数列 3, 12, 29, 54, 87, … のN番目の項を求めるC++プログラム
問題概要 この問題では、整数 N が与えられます。私たちのタスクは、以下の数列の N番目の項 を求めるC++プログラムを作成することです。 3, 12, 29, 54, 87, 128, …(第N項まで) 入出力例 まず、具体的な例を使って問題を確認しましょう。 入力: N = 5 出力: 87 数列の5番目の項は 87 であるため、これが正しい出力となります。 解法アプローチ:一般項の導出 この種の問題を効率的に解くには、数列の一般項(第n項を表す公式)を導き出すのが有効です。まず、隣り合う項の差に注目してみましょう。 12 − 3 = 9 29 − 12 = 17 54 − 29 =