C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で素数を法とする累乗の累乗(A^(B^C) mod M)を効率的に求める方法

    この問題では、4つの値 A、B、C、M(Mは素数)が与えられ、「素数を法とする累乗の累乗」を求めることが課題となります。具体的には、(A ^ (B ^ C)) (mod M) の値を計算する必要があります。入力例と出力例入力A = 3, B = 6, C = 2, M = 11出力3説明(A ^ (B ^ C)) = (3 ^ (6 ^ 2)) = (3 ^ 36)(mod 11) = 3解法アプローチ単純なアプローチとその問題点最も単純な解決策は、まず (B^C) の値を計算し、次に (A ^ (B ^ C)) を計算してからmodを取るという直接的な方法です。しかし、(B^C) は桁数が非

  2. 【C++】ターゲット命中確率が与えられたときのプレイヤーの勝利確率を求める方法

    この問題では、4つの値 p、q、r、s が与えられ、ターゲットへの命中確率が分かっている場合に、プレイヤーが勝利する確率を求めることが課題となります。 ここでは、2人のプレイヤーがアーチェリー競技を行っているとします。プレイヤー1がターゲットに命中する確率は p/q、プレイヤー2が命中する確率は r/s として定義されます。求めたいのは、プレイヤー1がこのゲームに勝つ確率です。 それでは、具体例を使って問題を確認しましょう。 入力 p = 3, q = 5, r = 2, s = 5 出力 0.789 解法のアプローチ この解法には確率に関する基礎知識が必要です。 プレイヤーがターゲットを射

  3. 【C++】M番目とN番目の項が与えられたときに等比数列(GP)のP番目の項を求める方法

    この問題では、m、n、m番目の項、n番目の項、p の5つの値が与えられます。私たちの課題は、等比数列(GP:Geometric Progression)の M番目と N番目の項が分かっているとき、その数列の P番目の項を求めることです。 つまり、等比数列の m番目の項と n番目の項の値をもとにして、同じ数列の p番目の項を計算する必要があります。 具体例を使って問題を確認してみましょう。 入力 m = 7, mthTerm = 1458, n = 10, nthterm = 39366, p = 3 出力 18 解き方のアプローチ ここでは、ある等比数列が与えられているものとします。この等比

  4. 【C++】親ポインタを持つ二分木で「右の兄弟」ノードを効率的に見つける方法

    この問題では、親ポインタを持つ二分木が与えられ、指定されたノードの右の兄弟(right sibling)を見つけることが課題となります。ここでいう「右の兄弟」とは、現在のノードと同じ深さ(レベル)に存在し、かつ木全体の中で現在のノードよりも右側に位置する最初のノードのことを指します。問題の例次のような二分木を考えてみましょう。 4 / \ 2 5 / \ 1 8 / \ 9 0 /

  5. C++で1の個数が最大となるバイナリ行列の行番号を求める方法

    この記事では、各行がソート済み(左側に0、右側に1が並ぶ)であるバイナリ行列が与えられたとき、1の個数が最も多い行の番号を求めるアルゴリズムを解説します。単純な全走査から二分探索、さらに最適化まで、段階的に改善できる3つのアプローチを紹介します。 問題の確認 まず、具体的な例で問題を理解しましょう。 入力 binMat[][] = { 1, 1, 1, 1 0, 0, 0, 0 0, 0, 0, 1 0, 0, 1, 1 } 出力 1 この例では、1行目(インデックス0)に4つの1が含まれているため、結果は「1」(1始まりの行番号)となります。 解法1:各行の1

  6. C++で行列内の合計が最大となる行を見つける方法

    この問題では、N×N のサイズを持つ行列 mat[][] が与えられ、その中から要素の合計が最大となる行を見つけることが課題となります。問題を理解するための例入力mat[][] = { 8, 4, 1, 9 3, 5, 7, 9 2, 4, 6, 8 1, 2, 3, 4 }出力Row 2, sum 24説明各行の合計を計算すると以下のようになります。行1: 合計 = 8+4+1+9 = 22 行2: 合計 = 3+5+7+9 = 24 行3: 合計 = 2+4+6+8 = 20 行4: 合計 = 1+2+3+4 = 10この中で最も合計が大きいのは行2(合計

  7. C++で地雷を含むマップ上の最短安全ルートを探索するアルゴリズム

    問題の概要 この問題では、二次元配列 mat[][] が与えられます。この配列は経路を表しており、値が 0 のセルは地雷(危険地帯)を示します。目的は、地雷を避けながらスタート地点からゴール地点まで到達できる最短の安全ルートを見つけることです。 安全に移動するためには、地雷の隣接セル(上下左右)も「危険」とみなし、踏まないようにしなければなりません。 移動中に許可される有効な移動は以下の4方向です。 - 左 : mat[i][j] => mat[i-1][j] - 右 : mat[i][j] => mat[i+1][j] - 上 : mat[i][j] => ma

  8. C++でリスト内の全単語の最短一意プレフィックスを求めるアルゴリズム

    問題概要この問題では、単語の配列 arr[] が与えられ、リスト内のすべての単語について「最短の一意のプレフィックス(接頭辞)」を求めることが課題となります。ここでいう一意のプレフィックスとは、他のどの単語の接頭辞にもならない、その単語だけを識別できる最短の文字列のことです。入力例arr[] = {learn, programming, code, leap}出力例c leap lear pこの例では、「code」は先頭の1文字「c」だけで他の単語と区別でき、「programming」も同様に「p」だけで十分です。一方、「learn」と「leap」は先頭の「lea」までが共通しているため、それ

  9. 【C++】2n+1個の整数配列から一度だけ現れる要素を見つける方法

    問題概要この問題では、(2n+1) 個の整数値からなる配列が与えられます。そのうち n 個の要素は配列内に2回ずつ出現し、ただ1つの要素だけが1回しか出現しません。この「1回だけ出現する要素」を見つけることが課題です。具体例を使って問題を確認しましょう。入力arr[] = {1, 3, 5, 6, 5, 1, 3}出力6上記の例では、1・3・5 の3つの要素がそれぞれ2回出現しており、6 だけが1回しか出現していません。したがって答えは 6 となります。解法アプローチ最もシンプルな解法は、各要素の出現回数をカウントする方法です。ハッシュマップなどを使って要素ごとの出現回数を記録し、最後に出現回

  10. C++で2値行列から「1」だけで形成される最大の「+」のサイズを求める方法

    問題概要 この記事では、N×Nの2値行列(バイナリ行列)bin[][] が与えられたとき、すべて「1」で構成される最大の「+」(プラス形)のサイズを求めるアルゴリズムを解説します。 まず、具体例を使って問題を確認しましょう。 入力 0 1 1 1 1 1 0 1 0 出力 5 この例では、中央の要素を中心として、上下左右の各方向に1個ずつ「1」が連続しています。したがって、「+」のサイズは「中心の1個+各方向1個×4=5」となります。 解法アプローチ この問題に対する基本的な考え方は以下のとおりです。 行列上の各マスが「1」である場合、そのマスを中心とした上下左右の4方向それぞれに、何個の「

  11. C++でマトリックス上の2点間の単一移動方向を判定する方法

    問題概要 この問題では、2つの点 (x1, y1) と (x2, y2) を表す4つの整数値 x1、y1、x2、y2 が与えられます。求めるのは、始点 (x1, y1) から終点 (x2, y2) へたった1回の移動で到達するための方向です。マトリックス上での移動に使える方向は1つだけで、答えは「Left(左)」「Right(右)」「Up(上)」「Down(下)」のいずれかの形式で返します。どの一方向でも到達できない場合は -1 を返し、「不可能」であることを示します。 入力例 x1 = 2, y1 = 1, x2 = 5, y2 = 1 出力例 Down 解き方のアプローチ この問題の

  12. C++で正方行列の対角線上の最小値・最大値を求める方法

    この問題では、サイズ n×n の正方行列が与えられます。求めるのは、行列の対角線上にある要素の中から最小値と最大値を見つけることです。具体的には、主対角線(左上から右下)と副対角線(右上から左下)それぞれについて、最小要素と最大要素を求めます。問題を理解するための例入力mat[][] = { {3, 4, 7}, {5, 2, 1}, {1, 8, 6} }出力主対角線の最小要素 = 2 主対角線の最大要素 = 6 副対角線の最小要素 = 1 副対角線の最大要素 = 7解法アプローチ①:二重ループを使うシンプルな方法最も基本的な解法は、ネストされたループ(二重ループ)を

  13. C++で片方向連結リスト内の最小値と最大値の要素を検索する方法

    問題概要この問題では、片方向連結リスト(単一リンクリスト)が与えられます。私たちのタスクは、リンクリスト内に存在する最小の要素と最大の要素を見つけることです。問題を理解するための例を見てみましょう入力 4出力Smallest element = 1 Largest element = 9解決アプローチこの問題に対するシンプルな解決策は、リンクリストを先頭からノードごとに走査することです。手順は以下の通りです。まず、minElement と maxElement を最初の要素の値(data)で初期化します。次に、リンクリストを1要素ずつ走査していきます。現在のノードの値を maxElement

  14. C++で指定された桁数と桁の合計から最小の数値を求める方法

    問題概要 この問題では、「sum(各桁の合計)」と「digit(桁数)」という2つの値が与えられます。求めるのは、指定された桁数を持ち、かつ各桁の合計がsumと一致するような最小の数値です。 具体例で問題を確認しましょう。 入力 sum = 15, digit = 2 出力 69 説明 桁の合計が15となる2桁の数は、69、78、87、96の4つです。この中で最も小さい数は69であるため、答えは69となります。 解法アプローチ 最も単純な解法は、指定された桁数を持つすべての数を順に調べ、桁の合計がsumと一致する最小の数を見つける方法です。しかし、この方法は探索範囲が膨大になるため非効率です。

  15. C++で指定された数字の最小順列を求める方法

    この記事では、大きな整数 N が与えられたときに、その数字を並べ替えて作れる最小の数(最小順列)を求めるアルゴリズムを解説します。問題の概要与えられた数値の各桁を自由に入れ替え、その中で最も小さい数値を作ることが目的です。ただし、先頭にゼロが来てしまうと桁数が変わってしまうため、その点への対処が必要になります。具体例で理解しようまず、例を使って問題を確認しましょう。入力N = 4529016出力1024569入力された「4529016」の各桁を並べ替えると、「1024569」が最小の数となります。解法アプローチこの問題に対するシンプルかつ効果的な解決策は、以下の手順で行います。大きな整数値を文

  16. C++で川の流速と上り・下りの時間比から人の速さを求める方法

    この問題では、川の流速 S(km/h)と、上り(上流方向)と下り(下流方向)の移動時間の比率 N の2つの値が与えられます。求めるのは、これらの情報から静水中における人の速さです。 具体例で問題を確認してみましょう。 入力 S = 5, N = 2 出力 15 これは、流速が 5 km/h で、同じ距離を上るときと下るときの所要時間の比率が 2 : 1 の場合、静水中の速さが 15 km/h になることを意味します。 解法アプローチ この問題は、流水問題(ボートと川の流れの問題)でよく使われる数学的な公式を利用することで、シンプルに解くことができます。ここからは、その公式がどのように導かれる

  17. C++におけるprivateとprotectedの違いを徹底解説

    本記事では、C++における2つのアクセス修飾子「private」と「protected」の違いについて、具体例を交えながらわかりやすく解説します。privateアクセス修飾子とは「private」キーワードとコロン「:」を使って宣言します。クラスの外部からは一切アクセスできません。privateは、そのメンバが宣言されたクラス内部のメンバからのみアクセスを許可するアクセス修飾子です。privateとして宣言されたデータにアクセスできるのは、メンバ関数またはfriend(フレンド)関数だけです。privateのサンプルコード#include <iostream> using name

  18. C++とJavaの違いを徹底解説!特徴の比較と言語選びのポイント

    C++とJavaの違いとは?C++とJavaは、どちらも世界中で広く利用されているプログラミング言語ですが、その設計思想や言語仕様には大きな違いがあります。本記事では、開発の背景から実行環境、メモリ管理、オブジェクト指向機能まで、両言語の主な相違点をわかりやすく解説します。開発の背景と歴史Javaの誕生Javaは、サン・マイクロシステムズ(Sun Microsystems)のジェームズ・ゴスリング(James Gosling)によって開発されました。Ada 83、Pascal、C++、C#などの言語から影響を受けており、「一度書けばどこでも動く(Write Once, Run Anywhere

  19. 【C++入門】コピーコンストラクタと代入演算子の違いを徹底解説

    C++を学んでいると、コピーコンストラクタと代入演算子の違いで混乱することがよくあります。どちらもオブジェクトの複製に関わる仕組みですが、その動作や使用場面はまったく異なります。この記事では、両者の違いをわかりやすく解説します。 コピーコンストラクタとは オーバーロードされたコンストラクタの一種です。 既存のオブジェクトのデータや値を使って、新しく生成されるオブジェクトを初期化します。 既存のオブジェクトを基に新しいオブジェクトを作成する際に使用されます。 元のオブジェクトと新しいオブジェクトは、それぞれ独立したメモリ領域に格納されます。 クラス内でコピーコンストラクタが定義されていない場合

  20. C++におけるインライン関数とマクロの違いを徹底解説

    本記事では、C++における「インライン関数」と「マクロ」の違いについて詳しく解説します。どちらも処理速度の向上を目的として使われますが、その仕組みや特性は大きく異なります。インライン関数(Inline)とはC++の正式な関数の一種であり、コンパイラによって解析されます。クラスの内部でも外部でも定義できます。引数は一度だけ評価されます。コンパイラがすべての関数をインライン化して展開するとは限らず、最適化の判断はコンパイラに委ねられます。クラス内で定義された短い関数は、自動的にインライン関数として扱われます。クラス内のインライン関数は、クラスのデータメンバにアクセスできます。関数本体は波括弧 {

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:263/300  20-コンピューター/Page Goto:1 257 258 259 260 261 262 263 264 265 266 267 268 269