C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で1ビット反転したときに得られる最長の「1」の連続列を求める方法

    問題の概要ある整数 n が与えられたとき、その中の 1ビットだけを反転(フリップ)することで、最も長く連続する「1」の並びを作ることを考えます。例として、数値が 13 の場合をみてみましょう。13 の2進表現は 1101 です。ここで 0 を 1 に反転すると 1111 となり、4桁すべてが 1 になります。これが反転によって実現できる最長の「1」の連続列です。解法のアプローチこの問題は、与えられた数値の各ビットを下位から順に走査することで効率的に解けます。走査中は次の2つのカウンタを管理します。curr(現在の長さ):現在進行中の「1」の連続列の長さprev(直前の長さ):ひとつ前の「1」の

  2. C++で二分木の各レベルにおける最大の積を求めるアルゴリズム

    問題の概要 正の値と負の値が混在するノードで構成された二分木が与えられたとします。このとき、木の各レベルに存在するノードの値の積を計算し、その中で最大となる値を求める必要があります。 例として、次のような二分木を考えてみましょう。 この木の場合、各レベルの積は以下のように計算できます。 レベル0の積:4 レベル1の積:2 × (-5) = -10 レベル2の積:(-1) × 3 × (-2) × 6 = 36 したがって、この木における最大のレベル積は 36 となります。 解決のアプローチ この問題は、木をレベル順走査(幅優先探索・BFS)でたどることで効率的に解けます。キューを利用して

  3. 【C++入門】2つの行列を乗算するプログラムの書き方を解説

    この記事では、C++を使って2つの行列を乗算するプログラムについて詳しく解説します。ここでの目標は、与えられた2つの行列の積を計算し、その結果を出力することです。なお、行列の乗算が成立するためには、1つ目の行列の列数が2つ目の行列の行数と一致している必要があります。これは行列の乗算における基本的な条件なので、必ず押さえておきましょう。行列の乗算の仕組み行列の積における各要素は、1つ目の行列の「行」と2つ目の行列の「列」に含まれる対応する要素同士を順番に掛け合わせ、それらをすべて足し合わせることで求められます。今回のサンプルコードでは、4×4の正方行列を扱い、三重のforループを用いてこの計算を

  4. C++でN以下の数値の中から桁の積の最大値を求める方法

    問題概要 正の整数N(N > 0)が与えられたとき、N以下の数値の中で「各桁の数字の積」が最大となる値を求めるのがこの記事のテーマです。 例えば、N = 390の場合を考えてみましょう。389という数値の桁の積は 3 × 8 × 9 = 216 となり、これが390以下の数値の中で最大です。したがって、求める答えは216になります。 解法のポイント:再帰的アプローチ この問題は、再帰呼び出しを使うことで簡潔に解くことができます。基本的な発想は、次の2つのパターンを比較するというものです。 そのままの数値:Nの各桁を掛け合わせた積 繰り下がりを起こした数値:上位の桁を1減らし、最下位の

  5. C++で1からnまでの数字パターンを使ってアルファベット「N」を出力するプログラム

    このチュートリアルでは、C++を使って「1からnまでの連続した数字」でアルファベット「N」の形をコンソールに出力するプログラムを解説します。 まず出力する文字「N」のサイズ(行数)を決定し、そのサイズに合わせて左側の縦線・中央の対角線・右側の縦線を、1から順に増えていく数字で描画していくのが今回の課題です。 「N」を描くための考え方 アルファベット「N」は次の3つの要素で構成されています。 左の縦線:各行の先頭に表示される数字 対角線:行が進むごとに1つずつ右へ移動しながら表示される数字(最初の行と最後の行を除く) 右の縦線:各行の末尾に表示される数字 各行の出力処理では、「左の数字 →

  6. C++で配列内の任意の2要素間の最小差を求める方法

    問題の概要n個の要素を持つ配列Aが与えられたとき、その配列内の任意の2つの要素間の最小の差(絶対差)を求めることを考えます。例えば、A = [30, 5, 20, 9] の場合、答えは 4 になります。これは要素 5 と 9 の差が最小となるためです。解法のアプローチこの問題は、以下の手順で効率的に解くことができます。配列を昇順(非降順)にソートする最小差を表す変数を無限大(INT_MAX)で初期化するソート後の配列で隣接する要素同士をすべて比較し、最小の差を記録していくソートを行うことで、最小の差は必ず隣接する要素間に存在することが保証されます。そのため、すべての要素の組み合わせを比較する必

  7. C++で ax²+bx+c ≥ k を満たす最小の正の整数 x を求める方法

    4つの整数 a、b、c、k が与えられたとき、次の不等式を満たす最小の正の整数 x を求める問題を考えてみましょう。ax² + bx + c ≥ k例えば、a = 3、b = 4、c = 5、k = 6 の場合、答えは 1 になります。解き方のアプローチこの問題は二分探索(バイナリサーチ)の手法を使うことで効率的に解くことができます。x は最小の正の整数でなければならないため、探索範囲の下限は 0 に設定します。 0 のとき単調増加するため、二分探索が適用できます。ある x で条件を満たすなら、それより大きい x でも必ず条件を満たすからです。サンプルコード#include<iostre

  8. C++で a^b に最も近い x の倍数を求める方法

    3つの値 a、b、x が与えられたとき、ab に最も近い x の倍数を求める問題を考えてみましょう。例えば、x = 4、a = 3、b = 3 の場合、33 = 27 に最も近い x の倍数は 28 となるため、出力は 28 になります。解法のアプローチ考え方はシンプルで、以下の条件に従って処理を分岐させます。b < 0 かつ a = 1 の場合: ab は 1 になるため、x に最も近い倍数は 0 または x となります。b < 0 かつ a > 1 の場合: ab は 1 より小さくなるため、x に最も近い倍数は 0 となります。b > 0 の場合: まず ab を

  9. C++で2D図形をコンソールに出力するプログラムの作成方法

    このチュートリアルでは、C++を使って2D図形をコンソールに出力するプログラムについて詳しく解説します。 図形を作成するために必要なパラメータ(半径、辺の長さ、幅など)が与えられ、それに応じて厚みのない輪郭だけの図形を出力するのが本プログラムの目的です。 対応する図形の種類 このプログラムでは、アスタリスク(*)を使って以下の4種類の2D図形を描画します。 円: 半径を指定して出力 長方形: 縦の長さと横の幅を指定して出力 三角形: 辺の長さを指定して出力 六角形: 辺の長さを指定して出力 プログラムの実装例 #include <bits/stdc++.h> using na

  10. C++で積と和の差が指定値DとなるN個の整数を見つける方法

    問題の概要2つの整数NとDが与えられたとき、それらの合計と積の差がちょうどDと等しくなるような、N個の整数の集合を見つける必要があります。例えば、N=3、D=5の場合、答えは「1, 2, 8」です。このとき合計は 1 + 2 + 8 = 11、積は 1 × 2 × 8 = 16 となり、16と11の差はちょうど5(= D)になります。解法のアプローチ:巧妙な構成テクニックこの問題を効率的に解くには、次のような構成を利用します。N−2個の「1」1つの「2」残りの1つとして「N + D」この構成を採用すると、合計・積・差はそれぞれ以下のように計算できます。合計 = (N − 2) × 1 + 2

  11. C++でシュテルンの二項級数(fusc関数)のn番目の項を求める方法

    この記事では、シュテルンの二項級数(Sterns Diatomic Series)のn番目の項を求める方法を、C++のコード例とともに解説します。シュテルンの二項級数とはシュテルンの二項級数は、次のような数列です。0, 1, 1, 2, 1, 3, 2, 3, 1, 4, 3, 5, 2, 5, 3, 4, …この数列は「fusc関数」としても知られており、正の整数を二進法で表したときに現れる連続する1の個数と深い関係があることで有名です。また、有理数を一意に列挙できることから、数学のさまざまな分野で応用されています。漸化式による定義この数列は、以下の漸化式で定義されます。nが偶数のとき:p(

  12. C++で数字パターンを出力するプログラムの作成方法

    はじめにこの記事では、C++を使って特定の数字パターンを出力するプログラムについて詳しく解説します。今回の課題は、ループ構造(for文)を活用して、以下のようなピラミッド状の数字パターンをコンソールに出力することです。 1 232 34543 4567654 567898765パターンの特徴このパターンには以下のような規則性があります。n行目は数字nから始まり、1ずつ増加しながら中央まで進みます中央を過ぎたら、今度は1ずつ減少しながら元の数字まで戻ります各行の先頭には、行番号に応じた数の空白が出力されますサンプルコード#include<bits/stdc++.h>

  13. C++で曲線上の特定の点における法線の方程式を求める

    曲線 y = x(A - x) が与えられたとき、この曲線上の任意の点 (x, y) における法線の方程式を求める方法を解説します。ここで A は整数定数、x と y も整数とします。 数学的アプローチ 1. 点が曲線上にあるか確認 まず、与えられた点 (x, y) が曲線 y = x(A - x) = Ax - x² を満たすかどうかを確認します。 2. 微分して接線の傾きを求める 曲線を x で微分すると、接線の傾き dy/dx が得られます: \(\frac{dy}{dx} = A - 2x\) 3. 法線の傾きと方程式 法線の傾きは接線の傾きの負の逆数 -dx/dy となります

  14. C++で長方形のパターンを出力するプログラムの作成方法

    このチュートリアルでは、指定された長方形のパターンを出力するC++プログラムについて解説します。プログラムには、長方形の高さ(height)と幅(width)が与えられます。私たちのタスクは、これらの寸法をもとに「@」文字を使用して長方形をコンソールに出力することです。アルゴリズムの考え方長方形の外枠だけを描くため、以下の条件に当てはまる位置にのみ「@」を出力します。1行目または最終行(i == 0 または i == h-1)1列目または最終列(j == 0 または j == w-1)それ以外の内側の位置には空白文字を出力します。この条件判定により、塗りつぶしではなく輪郭だけの長方形が描けます

  15. C++で指定された範囲内のすべての回文数を出力するプログラム

    このチュートリアルでは、指定された範囲内に存在するすべての回文数を見つけて出力するC++プログラムについて解説します。回文数とは、12321のように、前から読んでも後ろから読んでも同じになる数値のことです。このプログラムでは、検索対象となる数値の範囲(最小値と最大値)が与えられ、その範囲内に含まれるすべての回文数を検出して出力します。プログラムの流れ処理は大きく分けて2つのステップで構成されています。1. 回文判定関数(is_palin)引数として受け取った数値が回文かどうかを判定します。数値を1桁ずつ取り出しながら逆順に組み立て、元の数値と一致するかどうかを比較します。2. 範囲走査関数(c

  16. C++で配列の全要素の積をnで割った余りを効率的に求める方法

    問題の概要n個の要素からなる配列 A が与えられたとします。このとき、配列内のすべての要素を掛け合わせた値を n で割った余り(剰余)を求めて出力します。例として、A = [100, 10, 5, 25, 35, 14]、n = 11 の場合を考えてみましょう。このときの出力は 9 となります。つまり、以下の計算が成り立ちます。100 × 10 × 5 × 25 × 35 × 14 mod 11 = 9解法のポイント:オーバーフローを避ける工夫すべての要素を先に掛け合わせると、値が非常に大きくなり、整数型の範囲を超えてオーバーフローが発生する可能性があります。これを防ぐためには、次の手順で計算

  17. C++で文字列のすべての部分文字列を出力するプログラムの解説

    はじめにこの記事では、与えられた文字列からすべての部分文字列を取り出して出力するC++プログラムについて解説します。文字列(char型配列)が1つ与えられ、その文字列から生成できるすべての部分文字列を順番に画面へ表示するのが本プログラムの目的です。部分文字列とは部分文字列とは、元の文字列から連続する文字を取り出して作られる文字列のことです。例えば「abca」という文字列の場合、「a」「b」「ab」「bca」「abca」などがすべて部分文字列に該当します。長さnの文字列からは、長さ1の部分文字列がn個、長さ2のものがn-1個、長さ3のものがn-2個…と続くため、部分文字列の総数は n×(n+1)

  18. C++で階乗(n!)の各桁の合計を求める方法

    問題の概要 ある整数 n が与えられたとき、n の階乗(n!)における各桁の数字の合計を求めることが課題です。例として n = 5 を考えてみましょう。この場合、n! = 120 となるので、1 + 2 + 0 = 3 が答えになります。 解法のアプローチ 階乗の値は n が大きくなるほど爆発的に増加するため、通常の整数型では表現できません。そこで、階乗の各桁を vector に1桁ずつ格納する手法を用います。これは筆算と同じ要領で、繰り上がりを処理しながら掛け算を繰り返す方法です。 階乗の各桁を保存するための vector を作成し、初期値として 1 を入れておきます。 1 から n まで

  19. C++で3と5の両方で割り切れる数をすべて出力するプログラム

    はじめにこのチュートリアルでは、指定された数値未満のうち、3と5の両方で割り切れる数をすべて出力するC++プログラムについて解説します。具体的には、数値Nが与えられたとき、N未満の数の中から3と5の両方で割り切れるすべての数を見つけて出力するのがタスクです。アルゴリズムの考え方この問題は、剰余演算子(%)を使うことでシンプルに解くことができます。手順は以下の通りです。0からN-1までの数値を順番に調べます。各数値について、「3で割った余りが0」かつ「5で割った余りが0」であるかを判定します。両方の条件を満たす数値だけを出力します。なお、3と5の両方で割り切れる数は15の倍数と同じであるため、条

  20. C++で配列のすべての部分集合の合計値を効率的に求める方法

    n個の要素を持つ配列Aが与えられたとき、その配列のすべての部分集合の合計値の総和を求める問題を考えてみましょう。例えば、配列が A = [5, 6, 8] の場合、各部分集合とその合計は以下のようになります。部分集合合計5566885, 6116, 8145, 8135, 6, 819総和76考え方のポイントn個の要素を持つ配列の場合、部分集合の数は(空集合を含めて)2n 個存在します。ここで重要な性質に注目してみましょう。各要素は、ちょうど 2(n−1) 回だけ部分集合に出現するという点です。この性質を利用すると、すべての部分集合の合計値の総和は次の式で一発に計算できます。総和 = (配列の

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:105/300  20-コンピューター/Page Goto:1 99 100 101 102 103 104 105 106 107 108 109 110 111