C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で中学校的手法(素因数分解)を使って2つの数の最大公約数(GCD・HCF)を求めるプログラム

    この記事では、中学校で習う「素因数分解」の手法(ミドルスクール・プロシージャ/Middle School Procedure)を使って、2つの整数の最大公約数(GCD:Greatest Common Divisor、HCF:Highest Common Factor)を求めるC++プログラムを紹介します。 2つの整数が与えられたとき、それぞれを素因数分解し、共通する素因数のうち指数(べき乗)が小さい方を掛け合わせることで最大公約数を求めるのが、この手法の基本的な考え方です。 中学校的手法(Middle School Procedure)とは? 中学校の数学では、最大公約数を求めるときに次のよう

  2. C++で2つの数の最大公約数(GCD・HCF)を求めるプログラム

    このチュートリアルでは、C++を使って2つの数の最大公約数(GCD:Greatest Common Divisor、HCF:Highest Common Factor)を求めるプログラムについて解説します。ここでは、2つの整数が与えられたときに、その両方を割り切れる最大の数(最大公約数)を計算することを目標とします。プログラム例#include <iostream> using namespace std; int gcd(int a, int b){     if (a == 0)      

  3. C++でa^nとb^nのどちらが大きいかを判定するプログラム

    はじめにこのチュートリアルでは、an と bn のうち大きい方の値を求めるC++プログラムについて解説します。3つの整数 a、b、n が与えられます。私たちのタスクは、an と bn を計算し、そのうち大きい方の値を判定して出力することです。解き方のポイント単純に考えると、実際にべき乗を計算して比較すればよいように思えます。しかし、n が大きくなるとオーバーフローのリスクがあり、非効率です。そこで注目したいのが、べき乗関数 y = xn の性質です。n が偶数の場合: xn は常に0以上になるため、|a| と |b| の大小関係がそのまま結果に反映されます。n が奇数の場合: xn の符号は

  4. C++で2つの数の最大公約数(HCF)を求めるプログラム

    このチュートリアルでは、2つの数の最大公約数(HCF:Highest Common Factor、GCDとも呼ばれます)を求めるプログラムについて解説します。最大公約数とは、2つの整数をどちらも割り切ることができる正の整数の中で、最も大きいものを指します。例えば、98と56の場合、両方を割り切れる最大の数は14となるため、最大公約数は14です。アルゴリズムの考え方ここでは再帰的な手法を用いて最大公約数を求めます。基本的な流れは以下のとおりです。どちらかの数が0の場合は、0を返します2つの数が等しい場合は、その値が最大公約数となりますaがbより大きい場合は、aからbを引いた値とbで再帰的に計算し

  5. C++で長方形をちょうどk回カットしたときに得られる最小面積の最大値を求める方法

    このチュートリアルでは、与えられた長方形に対してちょうどk回のカットを行ったとき、分割後のピースの中で最小となる面積が取りうる最大値を求めるプログラムをC++で解説します。 入力として長方形の2辺の長さ(n・m)とカット回数kが与えられます。目的は、指定された回数だけカットを行った結果として実現できる最小面積を計算し、その分割戦略を最適化することです。 アルゴリズムのポイント 長方形を片方の辺に沿って切ると、その辺は(k+1)個に分けられます。整数除算では端数が切り捨てられるため、どの方向に・どう配分してカットするかが最小ピースの面積を左右します。処理の流れは以下の通りです。 k >

  6. C++で数値が1桁になるまでの桁の合計と積の最大値を求める方法

    本記事では、与えられた数値が1桁になるまで各桁の合計および積を繰り返し計算し、その結果の最大値を求めるC++プログラムについて解説します。 問題の概要 任意の整数が与えられたとき、次の2つの処理を実行します。 繰り返し合計(デジタルルート): 各桁の数字を合計し、結果が1桁になるまでこの操作を繰り返します。 繰り返し積(乗法的デジタルルート): 各桁の数字を乗算し、結果が1桁になるまでこの操作を繰り返します。 その後、2つの結果を比較し、大きい方の値を出力します。 C++での実装例 #include<bits/stdc++.h> using namespace std; //

  7. C++で二分木における親子ノード合計の最大値を求める方法

    このチュートリアルでは、二分木(Binary Tree)において「親ノードとその子ノード2つの値の合計」を計算し、その中で最大となる値を見つけるプログラムについて解説します。 具体的には、二分木が与えられたとき、左右両方の子を持つ各ノードについて「親ノード+左の子+右の子」の合計を求め、全ノードの中で最も大きい合計値を出力するのが目的です。 アルゴリズムの考え方 この問題は、木を再帰的に走査することで効率よく解くことができます。手順は以下の通りです。 現在のノードがNULLの場合は0を返します。 左部分木に対して再帰的に同じ処理を行い、結果を保持します。 現在のノードが左の子と右の子の両方を

  8. C++で約数条件によるジャンプを考慮した各位置の最大経路和を求める方法

    このチュートリアルでは、「約数条件のもとでジャンプしながら、各位置の最大経路和を求める」プログラムについて解説します。ここでは、n個のランダムな整数からなる配列が与えられるものとします。ある位置から、その位置の値が割り切れる別の位置へジャンプできるというルールのもと、与えられたすべての位置について、そこに至る最大経路和を計算して出力するのが目的です。アルゴリズムの考え方この問題は動的計画法(DP)を使うことで効率的に解くことができます。dp[i] には「位置 i に到達するまでの最大経路和」を格納します。位置 i+1 の約数 j をすべて列挙し、それらの約数に対応する位置の dp 値の最大値を

  9. 【C++】0行目の任意のセルから始まり、(N-1)行目の任意のセルで終わる最大パス合計の求め方

    本記事では、行列の0行目(最上行)の任意のセルから出発し、(N-1)行目(最下行)の任意のセルで終了する経路の中で、通過したセルの値の合計が最大になる「最大パス合計」を求めるプログラムについて解説します。 問題の概要 N×N の行列が与えられます。現在いるセル (i, j) からは、次の3種類の移動のみが許可されています。 (i+1, j) … 真下へ移動 (i+1, j-1) … 左下へ移動 (i+1, j+1) … 右下へ移動 つまり、必ず1行ずつ下へ進みながら、左右に最大1列だけずれて移動できるという制約があります。この条件のもとで、出発点と到達点を自由に選び、経路上のセルの値の総

  10. C++で解く:1回だけ出会える2人が収集できる最大ポイントの求め方

    問題概要本記事では、「1回だけ出会うことが許された2人が収集できる最大ポイント」を求めるC++のプログラムについて解説します。各セルにポイントが書かれた行列(マトリックス)が与えられます。2人の人物は、一方が左上の角から右下の角へ、もう一方が左下の角から右上の角へと移動します。移動の途中で2人はちょうど1回だけ同じセルで出会うことができ、そのとき2人が合計で収集できるポイントの最大値を求めるのが課題です。アルゴリズムの考え方この問題は動的計画法(DP)を用いることで効率的に解けます。まず、次の4つのテーブルを事前に計算しておきます。P1S:1人目がスタート地点(左上)から各セルへ到達するまでに

  11. 【C++】区間を1つ削除した後にカバーされる最大点数を求めるアルゴリズム

    はじめに このチュートリアルでは、区間を1つ削除した後にカバーされる最大の点数を求めるC++プログラムについて解説します。 問題設定は次のとおりです。N個の区間と最大範囲値Qが与えられたとき、1からQまでの範囲において、ある区間を1つ取り除いた際に残りの区間でカバーされる点の数が最大になるような区間を見つけます。 アルゴリズムの考え方 この問題は、次の手順で解くことができます。 被覆数の記録: 各点について、その点をカバーしている区間の本数を配列 Mark に記録します。 総被覆数の集計: Mark を走査し、少なくとも1つの区間に含まれる点の総数 count を求めます。 累積和の構築:

  12. C++で解く!マトリックス左上から右下への往復経路で獲得できる最大ポイントの求め方

    はじめに 本記事では、マトリックス(グリッド)の左上から右下へ移動し、再び出発地点へ戻るまでの往復経路で獲得できるポイントの最大値を求めるプログラムを、C++の実装例とともに解説します。 グリッドの各セルは次の3種類の記号で表現されます。 # … 通行できないブロックされた通路 * … 獲得できるポイントが置かれたセル . … 通行可能な空きセル 目的は、左上の角から右下の角へ向かう移動(右・下方向のみ許可)と、そこから出発点へ戻る移動(左・上方向のみ許可)を組み合わせて、収集できるポイントを最大化することです。 解法の考え方 この問題の鍵は、「往復の経路」を「同時にスタートし、右・下方向

  13. C++でn個の円の最大交点数を求める方法

    このチュートリアルでは、n個の円が作り得る交点の最大数を求めるプログラムについて解説します。与えられるのは円の個数 n のみです。その個数の円同士が取り得る交点の最大数を計算するのが私たちの課題となります。考え方まず数学的な背景を確認しておきましょう。平面上の2つの円は、最大で2つの交点を持ちます。n個の円から選べるペア(組み合わせ)の数は n(n−1)/2 通りあるため、各ペアごとの最大交点数である2を掛けると、全体の交点の最大数は次の式で表せます。n × (n − 1)例えば円が3個の場合は 3 × 2 = 6 個の交点が理論上の最大値になります。サンプルコード#include <b

  14. C++でn本の直線が作る最大交点数を求める方法

    はじめにこの記事では、n本の直線が作りうる最大の交点数を求めるプログラムをC++で実装する方法を解説します。問題設定はシンプルです。直線の本数nが与えられたとき、それらの直線が交わりうる交点の最大数を計算します。考え方交点数を最大化するためには、以下の条件が必要です。どの2本の直線も平行ではない3本以上の直線が同一の点で交わらないこの条件下では、交点は「n本の直線から2本を選ぶ組み合わせ」ごとに1つずつ生まれます。したがって、最大交点数は次の公式で表されます。最大交点数 = n × (n − 1) / 2実装例#include <bits/stdc++.h>using namesp

  15. C++で配列の2つの部分集合間の最大差を求める方法

    はじめに 本記事では、配列の2つの部分集合間で実現できる最大の差を求めるC++プログラムについて解説します。 問題の概要 ランダムな整数が1回または2回出現する配列が与えられます。この配列を2つの部分集合に分割し、それぞれの総和の差が最大になるようにすることが課題です。ただし、同一の数値を同じ部分集合に重複して含めることはできません。 具体例 次の配列を例に考えてみます。 { 4, 2, -3, 3, -2, -2, 8 } 1回のみ出現する正の数(4, 2, 3, 8)を部分集合1に、負の数(-3)を部分集合2に割り当てると、差は |17 − (−3)| = 20 となります。2回出現し

  16. 【C++】線分の中心を移動させて実現できる最大の交差領域を求める方法

    はじめにこのチュートリアルでは、線分の中心を移動させることで実現できる最大の交差領域を求めるC++プログラムについて解説します。この問題では、3つの線分の中心座標とそれぞれの長さが与えられます。各線分の中心は距離Kまで移動することが許されており、その移動を活用して交差領域の長さを最大化することが目的です。アルゴリズムの考え方まず、3つの中心座標を昇順にソートし、最も外側にある2つの中心(最小値と最大値)の距離に着目します。この距離と移動量K・線分の長さとの関係から、次の3つの場合に分けて判定できます。中心間の距離 ≥ 2K + 線分の長さ の場合:どれだけ移動しても交差は発生しないため、0を返

  17. C++でK個の要素を削除した後の配列の中央要素の最大値を求める方法

    はじめに この記事では、配列からちょうどK個の要素を削除したときに、残った配列の中央要素として実現できる最大値を求めるC++プログラムを解説します。 サイズNの整数配列と整数Kが与えられます。どのK個を削除するかを工夫して、削除後の配列の中央要素をできるだけ大きな値にすることが課題です。 解き方の考え方 K個の要素を削除すると、残りの配列のサイズは N − K になります。このとき中央要素の位置(1始まり)は (N + 1 − K) / 2 で求められます。 ここで重要なのは、「先頭側から何個・末尾側から何個削除するか」を自由に選べるという点です。先頭から j 個、末尾から K − j 個を削

  18. C++で指定した操作を実行した後の配列における最大積の求め方

    このチュートリアルでは、C++を用いて「指定された操作を実行した後に配列で得られる最大の積」を求めるプログラムについて詳しく解説します。 問題の概要 サイズNの整数型配列が与えられます。私たちのタスクは、次のいずれかの操作を合計N-1回実行し、最終的に残る値の積が最大になるようにすることです。 操作1: a[j] の値を a[i]*a[j] に書き換え、a[i] を配列から取り除く(要素同士を掛け合わせて統合する) 操作2: a[i] の値をそのまま削除する(この操作は全体で1回のみ使用可能) つまり、すべての操作が終わった時点で配列には要素が1つだけ残り、その値が可能な限り大きくなるよ

  19. 【C++】他の配列の同じウィンドウの要素が一意になるときの、配列ウィンドウの最大合計の求め方

    はじめに 本記事では、ある配列内のウィンドウ(連続する部分範囲)の合計値が最大となり、かつ同じ位置のウィンドウに対応する別の配列の要素がすべて一意(重複なし)である場合の、その最大合計を求めるプログラムについて解説します。 具体的には、要素数が等しい2つの配列 A と B が与えられます。目的は、配列 A の対応するウィンドウ内の要素がすべて重複なく一意であるという条件を満たす中で、配列 B のウィンドウの合計が最大になる範囲を見つけることです。 アルゴリズムの考え方(スライディングウィンドウ) この問題は「スライディングウィンドウ(尺取り法)」とハッシュセット(unordered_set)を

  20. C++で4桁の数字から作成できる最大の時刻を求める方法

    はじめに このチュートリアルでは、4つの数字から作成できる最大の時刻を求めるC++プログラムについて解説します。 具体的には、4つの数字を要素として持つ配列が与えられます。この4つの数字をすべて使い、24時間形式で表せる最大の時刻を見つけることが課題です。例えば、{0, 0, 0, 9}という配列が与えられた場合、作成できる最大の時刻は「09:00」となります。 アルゴリズムの考え方 時刻は「HH:MM」の形式で表されますが、それぞれの桁には次のような範囲の制約があります。 時間の十の位: 0〜2 時間の一の位: 十の位が「2」の場合は0〜3、それ以外の場合は0〜9 分の十の位: 0〜5

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:217/300  20-コンピューター/Page Goto:1 211 212 213 214 215 216 217 218 219 220 221 222 223