C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++ STLのiswdigit()関数とは?使い方をわかりやすく解説

    C++ STLにおけるiswdigit()関数は、指定されたワイド文字が10進数字(decimal digit)であるかどうかを判定するための組み込み関数です。この関数は、C/C++の <cwctype> ヘッダーファイル内に定義されています。10進数字とは?10進数字とは、0から始まる数値を表す文字のことで、具体的には「0、1、2、3、4、5、6、7、8、9」の10種類を指します。iswdigit()関数の構文int iswdigit(wint_t c);パラメータ: c は判定対象となるワイド文字で、wint_t 型にキャストして渡すか、WEOF を指定します。wint_t は

  2. C++ STLのiswlower()関数とは?構文・戻り値・サンプルコードを徹底解説

    C++標準テンプレートライブラリ(STL)におけるiswlower()関数は、指定されたワイド文字が小文字かどうかを判定するために使用される関数です。小文字でない場合、この関数は0(ゼロ)を返します。ASCIIコード97〜122に対応する「a」〜「z」が小文字のアルファベットに該当します。iswlower()関数は、C/C++ではcctypeヘッダー(ワイド文字を扱う場合はwctype.h)に定義されています。 iswlower()関数の構文 int iswlower(wint_t c) パラメータ − cは判定対象となるワイド文字です。wint_t型にキャストして渡すか、ストリームの終端を表

  3. C++ STLのiswctype()関数とは?使い方とサンプルコードをわかりやすく解説

    C++の標準テンプレートライブラリ(STL)において、iswctype()関数は、指定されたワイド文字が引数descで示されるプロパティ(文字分類)を持っているかどうかを判定するために使用されます。iswctype()は組み込み関数であり、ヘッダーファイル「wctype.h」(C++では「cwctype」)で宣言されています。iswctype()関数の構文int iswctype(wint_t c, wctype_t desc);この関数は、ワイド文字cがdescで指定されたプロパティを持つかどうかをチェックします。パラメータ(引数)c … 判定対象となるワイド文字です。整数型wint_tにキ

  4. C++で解く4Sum問題:和がtargetとなる4つ組をすべて見つけるアルゴリズム

    問題の概要数値の配列が与えられ、そこに n 個の整数が格納されているとします。この中から4つの要素 a、b、c、d を選び、a + b + c + d = target を満たす組み合わせをすべて見つけたいと思います。ただし、重複する組は除外し、「一意な」4つ組のみを求めます。たとえば、配列が [-1, 0, 1, 2, 0, -2]、target が 0 の場合、結果は [[-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2]] となります。解法の手順この問題は、Two Sum でおなじみの「ソート+双方向ポインタ(two-pointer)」の手法を再帰的に

  5. C++で連結リストのノードをペアごとに交換する方法

    ここでは、連結リスト(リンクリスト)が与えられたとき、隣り合う2つのノードをペアごとに入れ替え、その結果の先頭ノードを返す問題を扱います。重要な制約として、ノードが持つ値(val)を変更することはできず、ノード自体のつながり(ポインタ)だけを操作して入れ替えを行う必要があります。例えば、リストが [1,2,3,4] の場合、処理後のリストは [2,1,4,3] となります。奇数個の要素がある場合は、最後の1つのノードはそのまま残ります。アルゴリズムの手順この問題は、以下の手順で解くことができます。head が存在しない(NULL の)場合は、そのまま head を返すfirst := head

  6. C++で乗算・除算・剰余演算を使わずに2つの整数を除算する方法

    問題概要 2つの整数「被除数(dividend)」と「除数(divisor)」が与えられます。乗算(*)・除算(/)・剰余演算子(%)を使用せずに、被除数を除数で割った商を求めてください。ただし、整数除算の結果はゼロ方向へ切り捨てるものとします。入力はいずれも整数です。 例えば、被除数 = 7、除数 = -3 が与えられた場合、出力は -2 となります。 解法の考え方 この問題は、ビットシフトを活用した繰り返し減算によって効率的に解くことができます。ビットシフトは値を2倍(または半分)にする操作であるため、これを組み合わせることで、禁止された演算子を使わずに除算と同等の処理を実現できます。

  7. C++でビット単位のAND演算を使って0からXへの変換に必要な最大ステップ数を求める方法

    問題の概要 この問題では、整数 X が与えられ、0 から X への変換にかかる最大ステップ数を求めます。 有効な変換とは ある値 A から別の値 B への変換が 1 ステップとしてカウントされるのは、次の条件を満たす場合です。 A != B(A と B は異なる値であること) A & B = A(& はビット単位の AND 演算) つまり、A から B への変換が 1 ステップであり、0 から X への変換における最大ステップ数を計算するプログラムを作成します。 入出力例 入力: X = 7 出力: 3 解説 0 から 7 への変換は、以下の手順で行われます。 Ste

  8. C++で最大2つの要素の符号を反転した後の最大部分配列和を求める方法

    問題概要この記事では、配列が与えられたときに「最大2つの要素の符号を反転する」操作を行った後の、最大部分配列和(サブアレイ合計)を求めるC++プログラムを紹介します。つまり、配列内の任意の要素を最大2つまで選んで符号を反転し、その状態で合計値が最大になる部分配列(連続する要素の並び)を見つけることが目的です。入力例と出力例入力:array = {-5, 1, 3, 8, -2, 4, 7}出力:30解説:インデックス0から6までのすべての要素を対象に、負の値である -5 と -2 の符号を反転します。元の配列の合計は16ですが、-5→5、-2→2 と反転すると 5+1+3+8+2+4+7 =

  9. C++で最大K個の配列要素の符号を反転して最大化する部分配列の合計

    問題概要 この問題では、整数の配列と整数 k が与えられます。求めるのは、最大 k 個までの配列要素の符号を反転したときに実現できる部分配列(サブアレイ)合計の最大値を計算するプログラムを C++ で作成することです。 コードの説明 − 配列から作られる部分配列の合計が最大になるように、符号を反転する要素を最大 k 個まで選びます。 入出力例 入力 − array = {1, -2, 7, 0}、k = 2 出力 − 10 説明 − 要素「-2」を 1 つだけ反転すればよいため、配列の合計は 10 となり、これが達成可能な最大値になります。 解法のアプローチ:動的計画法 この問題は動的計画

  10. C++で配列をk回繰り返して作った配列の最大部分配列和を求める方法

    問題概要この問題では、1つの配列と整数 k が与えられます。与えられた配列を k 回繰り返してできる新しい配列の中から、最大部分配列和(連続する要素の合計の最大値)を求めるプログラムを C++ で作成します。具体例で確認してみましょう。入力: array = {3, 5, 1}、k = 2出力: 18説明:配列を2回繰り返すと、 array = {3, 5, 1, 3, 5, 1} 最大部分配列和 = 3+5+1+3+5+1 = 18解法のアプローチこの問題を効率的に解くポイントは、元の配列の全要素の合計(arraySum)を先に計算し、その符号によって場合分けすることです。arraySum

  11. C++のプレフィックス和(累積和)を活用してO(n)で最大部分配列和を求める方法

    問題概要 正の整数と負の整数が混在する配列が与えられたとき、その配列の中で合計値が最大となる部分配列(連続した要素の並び)の合計を求める問題です。 例 入力配列が {-12, -5, 4, -1, -7, 1, 8, -3} の場合、合計が最大になる部分配列は {1, 8} となるため、出力は 9 になります。 アルゴリズム この問題は、プレフィックス和(累積和)を利用することで O(n) の時間計算量で効率的に解くことができます。考え方の核心は、「ある位置 i で終わる部分配列の合計の最大値」は「prefix_sum[i] から、それ以前に現れた最小の累積和を引いた値」で表せるという点です

  12. C++でmを法とする最大部分配列の総和を求めるアルゴリズム

    C++でmを法とする最大部分配列の総和とは この問題では、サイズnの整数型配列と整数mが与えられます。求めるのは、すべての部分配列の総和の中から、mで割った余りが最大となる値です。 問題の概要 − 各部分配列の全要素の合計をmで割った余りを計算し、その中で最大の値を求めます。 具体例で問題を確認しよう まずは例を見て、問題の内容を理解しましょう。 入力 − array = {4, 9, 2}、m = 6 出力 − 5 説明 − すべての部分配列と、それぞれを6で割った余りは以下の通りです。 {4}: 4 % 6 = 4 {9}: 9 % 6 = 3 {2}: 2 % 6 = 2 {4, 9}

  13. 【C++】ビット単位のORがkと等しくなる最大長の部分集合を求めるアルゴリズム

    問題文 負でない整数からなる配列と整数 k が与えられたとき、ビット単位のOR(論理和)が k と等しくなる最大長の部分集合を求めます。 具体例 入力配列 = [1, 4, 2]、k = 3 の場合、出力は次のようになります。 [1, 2] 1 と 2 のビット単位のORは 3 に一致します。 これより長い(長さ3以上の)部分集合を作ることはできません。 アルゴリズムの考え方 まず、ビット単位のORには次のような基本的な性質があります。 0 OR 0 = 0 1 OR 0 = 1 1 OR 1 = 1 この性質から、以下のことが導けます。 k の二進表現において 0 になっているビット位置

  14. C++でNを約数で繰り返し除算した際の最大合計を求める方法

    問題概要 この問題では、整数 N が与えられます。求めるのは、N を約数で繰り返し除算していったときに得られる値の合計の最大値です。C++ を使ってこの計算を行うプログラムを作成します。 アルゴリズムの考え方 基本的な方針は次のとおりです。 数値 N を 1 になるまで繰り返し除算する。 各ステップで現れる値(元の数と商)をすべて合計する。 合計を最大化するために、毎回最小の約数で割る。 なぜ最小の約数で割るのが最適なのでしょうか。それは、最小の約数で割ると各ステップでの商が最も大きくなり、途中の値が高い水準を保てるためです。結果として、合計も最大になります。 入出力例 入力: N =

  15. 【C++】同じセットビット数を持つ数値を加算して得られる最大合計の求め方

    問題文N個の数値からなる配列が与えられたとき、同じ数のセットビット(2進数表現で「1」になっているビット)を持つ数値同士をグループ化して加算し、その中で最大となる合計値を求めるのが課題です。例入力配列が {2, 5, 8, 9, 10, 7} の場合、出力は 24 になります。まず各数値のセットビット数を確認してみましょう。2 のセットビット数は 1(10進数: 2 → 2進数: 10)5 のセットビット数は 2(2進数: 101)8 のセットビット数は 1(2進数: 1000)9 のセットビット数は 2(2進数: 1001)10 のセットビット数は 2(2進数: 1010)7 のセットビット

  16. C++で解く直角三角形の数字パスにおける最大合計の求め方

    問題文数字が直角三角形の形に配置されたデータが与えられます。三角形の頂点から底辺へ向かう経路の中で、通過する数字の合計が最大になるものを見つけてください。ただし、各経路では次の数字として「真下」または「右斜め下」のいずれかのマスを選んで移動します。例入力: 3 4 5 1 10 7 このとき、最大合計は 18 となります(3 + 5 + 10 の経路が最適)。アルゴリズム基本的な考え方は、「最終行の各マスで終わる経路の最大合計」をすべて求め、その中から最大値を答えとして返すというものです。これらの合計は、一つ上の行にある2つのマス(左上・右上)を順に参照していくことで再帰的に計算できます。し

  17. C++で行列内の砂時計(アワーグラス)の最大合計を求めるプログラム

    問題概要 この問題では、1つの行列が与えられます。私たちのタスクは、C++を使って、行列内に存在するすべての「砂時計(アワーグラス)」形状の要素の合計を計算し、その中で最大となる値を見つけるプログラムを作成することです。 プログラムの説明 − 与えられた行列の要素から作成できるすべての砂時計について合計を求め、その最大値(maxSum)を出力します。 砂時計(アワーグラス)とは 砂時計とは、行列の中で次のような形に配置された7つの要素からなる図形のことです。 X X X   X X X X 具体的な例を使って問題を理解しましょう。 入力 − array = {   &nbs

  18. C++で配列の全回転における i*arr[i] の最大合計を求める方法

    問題概要この問題では、整数配列 arr が与えられます。求めるのは、配列のすべての回転(ローテーション)の中で、各要素にそのインデックスを掛けた値の合計 i * arr[i] が最大になる値です。具体例で理解する入力: arr = {4, 8, 1, 5}出力: 37解説: すべての回転と、それぞれの i*arr[i] の合計は以下の通りです。すべての回転と i*arr[i] の合計:{4, 8, 1, 5} = 4*0 + 8*1 + 1*2 + 5*3 = 25{8, 1, 5, 4} = 8*0 + 1*1 + 5*2 + 4*3 = 23{1, 5, 4, 8} = 1*0 + 5*1

  19. C++で最大要素がkとなる重複しない部分配列の長さの最大合計を求める方法

    問題概要 この問題では、整数型の配列と整数 k が与えられます。求めるのは、「最大要素がちょうど k となる重複しない(オーバーラップしない)部分配列」について、その長さの合計の最大値です。 言い換えると、与えられた配列から切り出せる連続した部分配列のうち、最大値が k と一致するものだけを選び、それらが互いに重ならないようにした場合の長さの総和を最大化する、という問題です。 問題の詳細 入力として配列と整数 k を受け取り、配列内から作成可能なすべての部分配列のうち、最大要素が k になるものを探します。そして、互いに重複しないような部分配列を選んだときの長さの合計を求めます。 具体例で

  20. C++で二分木の各レベルにおける非葉ノードの合計の最大値を求める方法

    この記事では、二分木が与えられたときに、すべてのレベルの中から非葉ノード(子ノードを持つノード)の合計が最大となるレベルの合計値を求めるC++プログラムの作成方法を解説します。 問題の概要 二分木の各レベルごとに非葉ノードのデータ値の合計を計算し、その中で最も大きい合計値を出力します。 入力例 出力例 9 解説 各レベルにおける非葉ノードの合計は以下のようになります。 レベル1: 4 レベル2: 1 + 2 = 3 レベル3: 9(4と7は葉ノードのため対象外) レベル4: 0 この結果から、最大の合計値は「9」であることがわかります。 解決のアプローチ この問題を解くには、二分木に対してレ

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:129/300  20-コンピューター/Page Goto:1 123 124 125 126 127 128 129 130 131 132 133 134 135