-
C++で連結リストのモジュラーノードを検索する方法を解説
この問題では、片方向連結リスト L と数値 k が与えられます。求められるのは、連結リストの中から「モジュラーノード」を見つけ出すことです。問題の概要モジュラーノードとは、ノードのインデックス i が k で割り切れる(i % k == 0)ノードのうち、最後尾に近いものを指します。つまり、条件を満たすノードの中で最も後ろにあるノードを返す必要があります。入出力の例具体的な例で問題を確認してみましょう。入力ll = 3 -> 1 -> 9 -> 6 -> 8 -> 2, k = 4出力6解説要素 6 はインデックス 4 の位置にあり、4 は k = 4 で割り切れ
-
C++でN以下の2・3・5の倍数を数える方法|包除原理による効率的なアルゴリズム
この問題では、整数 N が与えられ、N 以下にある 2・3・5 のいずれかの倍数をすべて求めることが課題になります。 問題の概要 1 から N までの整数のうち、2・3・5 の少なくとも 1 つで割り切れる数が全部でいくつあるかを数えます。 入力例 N = 7 出力例 5 解説 1 から 7 までの要素:1, 2, 3, 4, 5, 6, 7 2・3・5 のいずれかで割り切れる要素:2, 3, 4, 5, 6 解法① 全探索(シンプルなアプローチ) 最も基本的な解法は、1 から N まですべての数を順番にチェックし、2・3・5 のいずれかで割り切れる数をカウントしていく方法です。 アルゴリズ
-
C++で巨大な数Nの「N % 4(4で割った余り)」を効率的に求める方法
この問題では、非常に大きな整数を表す文字列 num が与えられます。求めるのは、桁数が大きい値 N に対して「N % 4(4で割った余り)」を計算することです。 問題の概要 与えられた巨大な数値を 4 で割った余り(剰余)を求めるのが課題です。 入力例 num = 453425245 出力例 1 解法のアプローチ この問題には、解決の鍵となる便利な性質があります。それは「ある数を 4 で割った余りは、その数の下2桁だけで決まる」というものです。 これは、100 が 4 の倍数であるため、どれほど桁数が多くても下2桁より上の部分は必ず 4 の倍数になるからです。つまり、たとえ何万桁の巨大な数で
-
【C++】与えられた2つの方程式を満たすN個の正の整数を見つける方法
この問題では、3つの値 A、B、N が与えられ、与えられた2つの方程式を同時に満たすN個の正の整数を見つけることが求められます。問題の概要以下の2つの条件を同時に満たすN個の正整数 x₁, x₂, …, xₙ を見つけます。x12 + x22 + … + xn2 ≥ Ax1 + x2 + … + xn ≤ B条件を満たす組み合わせが存在する場合はそのN個の値を出力し、存在しない場合は -1 を出力します。入出力例で問題を理解しよう入力N = 4, A = 65, B = 16出力1 1 1 8説明出力された値は、次のように両方の条件を満たしています。12 + 12 + 12 + 82 = 1
-
C++で4と7のみで構成される数列のn番目の要素を求める方法
この問題では、整数 N が与えられ、「4」と「7」の2種類の数字のみで構成される数列の n 番目の要素を求めることが課題となります。 対象となる数列は以下のとおりです。 4, 7, 44, 47, 74, 77, … 入出力例 入力 N = 4 出力 47 説明 数列は 4, 7, 44, 47, … と続くため、4番目の要素は「47」になります。 解法アプローチ 最もシンプルな解決策は、N 番目まで数列を順番に生成していくことです。この数列には明確な規則性があります。ある数の末尾が「7」であれば、その前後の数の末尾は必ず「4」になっています。 そこで、1番目と2番目の要素を出発点とし、漸化
-
C++で二分木の後順走査におけるn番目のノードを検索する方法
問題概要この問題では、二分木と整数Nが与えられます。求められているのは、二分木の後順走査(ポストオーダートラバーサル)におけるN番目のノードを見つけることです。二分木とは、各ノードが最大2つの子ノードを持つことができる特殊な木構造です。トラバーサル(走査)とは、木に含まれるすべてのノードを順に訪問する処理のことで、訪問時にノードの値を出力することもあります。具体例を使って問題を理解しましょう。入力N = 6対象となる二分木は以下の通りです。 1 / \ 2 3 / \ / \ 4 5 6 7出力3説明この木の後順走査の順序は「4
-
C++で二分木の先行順走査(プレオーダー)におけるN番目のノードを求める方法
この記事では、二分木と整数 N が与えられたときに、先行順走査(プレオーダートラバーサル)における N 番目のノードを見つける方法を解説します。まず用語を整理しましょう。二分木とは、各ノードが最大で2つの子ノードを持つことができる特別な木構造のことです。また、走査(トラバーサル)とは、木に含まれるすべてのノードを順番に訪問し、必要に応じてその値を出力する処理のことを指します。先行順走査は「根 → 左部分木 → 右部分木」の順序でノードを訪問する方式です。具体例で問題を理解しよう入力N = 6以下のような二分木を考えます。出力6解説木の先行順走査の結果:1, 2, 4, 5, 3, 6, 7この
-
【C++】二分木の中間順走査でN番目のノードを検索する方法
この記事では、二分木(バイナリツリー)と整数Nが与えられたときに、二分木を中間順走査(inorder traversal)した際のN番目のノードを見つける方法を解説します。 二分木とは、各ノードが最大2つまでの子ノードを持つことができる特殊な木構造データです。 走査(トラバーサル)とは、木構造に含まれるすべてのノードを訪問する処理のことで、訪問時に各ノードの値を出力することもできます。 それでは、具体的な例を使ってこの問題を理解していきましょう。 入力例 N = 6 出力例 3 説明 木の中間順走査の結果:4, 2, 5, 1, 6, 3, 7 上記の走査結果において6番目に訪問されるノード
-
数列「1, 2, 2, 3, 3, 3, 4…」のn番目の項を求めるC++プログラム
この問題では、整数Nが与えられ、数列 1, 2, 2, 3, 3, 3, 4… のn番目の項を求めることが課題となります。具体例で問題を理解しましょう。入力N = 6出力3説明n番目までの数列は 1, 2, 2, 3, 3, 3, … となるため、6番目の項は「3」です。解法アプローチ①:二重ループを使うシンプルな方法最も単純な解き方は、ネストした(入れ子になった)ループを使用する方法です。外側のforループを1からnまで回し、内側のループを1からi(外側のループのイテレータ)まで回します。内側のループの各反復で数列の要素数をカウントし、カウントがnに等しくなった時点でiの値を返せば答えが得ら
-
数列 7, 15, 32, … のn番目の項を求めるC++プログラム
この問題では、整数 N が与えられ、数列「7, 15, 32, …」のn番目の項を求めることが課題となります。 問題を理解するための例 入力 N = 6 出力 281 説明 n番目の項までの数列は「7, 15, 32, 67, 138, 281」となります。 解法アプローチ この問題を解く鍵は、数列の規則性を読み解くことにあります。この数列は、複数の規則が組み合わさった複合的な数列であることがわかります。 まず、隣接する項同士の差を調べてみましょう。 T(2) - T(1) = 15 - 7 = 8 T(3) - T(2) = 32 - 15 = 17 ここから、各項の間には次のような漸化式
-
数列 9, 33, 73, 129, ... の第n項を求めるC++プログラム
問題概要 この問題では、整数 N が与えられ、数列 9, 33, 73, 129, ... の第 n 項を求めることが課題となります。 具体例を使って問題を確認してみましょう。 入力 N = 4 出力 129 説明 数列は 9, 33, 73, 129, ... と続いており、4番目の項は 129 です。 解法のアプローチ この問題を解く鍵となるのは、数列の一般項(第n項の公式)を導出することです。まず数学的に一般項を求め、その公式をプログラムに適用します。 まず、元の数列と、それを1項だけずらした数列の差を取ってみましょう。 Sum = 9 + 33 + 73 + … + t(n-1)
-
数列1, 4, 27, 16, 125, 36, 343…のn番目の項を求めるC++プログラム
この記事では、整数Nが与えられたときに、次の数列のn番目の項を求める方法を解説します。対象となる数列: 1, 4, 27, 16, 125, 36, 343…問題の例入力N = 7出力343説明N = 7 の場合、数列の7番目の項は 343 となります。解法アプローチこの問題を効率的に解くには、数列の規則性(一般項)を見つけることが重要です。この数列をよく観察すると、奇数番目の項と偶数番目の項という2つの異なるパターンが交互に現れていることがわかります。偶数番目の項: インデックスの2乗(例: 2²=4, 4²=16, 6²=36)奇数番目の項: インデックスの3乗(例: 1³=1, 3³=2
-
数列1, 3, 6, 10, 15, 21, 28…のn番目の項を求めるC++プログラム
この問題では、整数Nが与えられます。求めるのは、数列「1, 3, 6, 10, 15, 21, 28 …」のn番目の項です。 例を使って問題を理解しましょう。 入力 N = 7 出力 28 説明 数列は 1, 3, 6, 10, 15, 21, 28 … と続いており、7番目の項は28になります。 解法アプローチ この問題へのシンプルなアプローチは、数列の一般項を見つけることです。数列を観察すると、i番目の数が「(i−1)番目の項 + i」という規則で表されていることがわかります。 実は、このような数は三角数(triangular number)と呼ばれます。三角数とは、1からnまでの自然数
-
【C++】数列2, 10, 30, 68, 130…の第N項を求めるプログラム
この問題では、整数Nが与えられ、数列 2, 10, 30, 68, 130, … の第N項を求めることが課題となります。 まずは具体例で問題を確認してみましょう。 入力 N = 7 出力 350 説明 数列は 2, 10, 30, 68, 130, 222, 350, … と続きます。 したがって、7番目の項は 350 となります。 解法アプローチ この問題に対する最もシンプルな解決策は、数列の一般項を導き出すことです。各項とそのインデックス(項番号)の関係を調べると、この数列の第N項は次の式で表されることが分かります。 第N項 = N³ + N 実際に各項を検証してみましょう。 i = 1
-
数列 3、9、21、41、71…の第N項を求めるC++プログラム
この問題では、整数 N が与えられます。目的は、数列「3, 9, 21, 41, 71, …」の第 N 項を求めることです。入力例N = 7出力例169説明この数列は 3, 9, 21, 41, 71, 113, 169, … のように続きます。したがって、N = 7 のときの第 7 項は 169 となります。解法アプローチこの問題に対するシンプルな解法は、数列の一般項を導き出すことです。数列を注意深く観察すると、一般項は次の式で表せることに気づきます。$$T(N) = \sum n^{2} + \sum n + 1$$つまり、「最初の n 個の自然数の平方和」と「最初の n 個の自然数の和」
-
C++で各変数が1つ欠けたn個の和の方程式からn個の変数を求める方法
この問題では、(n−1)個の変数の和から構成される配列 sum[] が与えられます。各要素は、対応する1つの変数を除いた残りすべての変数の和を表しています。 Sum[1] = x2 + x3 + x4 + … + xn Sum[2] = x1 + x3 + x4 + … + xn . . Sum[i] = x1 + … + x(i-1) + x(i+1) + … + xn . . Sum[n] = x1 + x2 + x3 + … + x(n-1) この記事のゴールは、これらの式から x1, x2, …, xn の値を求めることです。 入力例 sum[] = {6, 6, 6, 6, 6, 6
-
C++で2つの配列の要素の和からなる集合のN番目の要素を検索する方法
この記事では、サイズmの2つのソート済み配列 arr1[] と arr2[]、および整数Nが与えられたときに、「2つの配列の要素の和から形成される集合」の中のN番目の要素を求める方法を解説します。 問題の概要 ここで扱う集合とは、arr1[i] + arr2[j](i、j < m)で表されるすべての和の値を、重複なく集めたものです。与えられたNに対して、この集合のN番目の要素の値を求めるのが課題となります。 入力例 arr1[] = {3, 1, 5} , arr2[] = {6, 2, 8} , N = 4 出力 7 説明 2つの配列の要素の和から作られる集合の要素は以下の通りです。
-
C++で「3」と「4」だけを使った記数法のn番目の数を求める方法
この問題では、整数 N が与えられ、「3」と「4」の数字のみを使用する特殊な記数法における N番目の数 を求めます。 この記数法は、次のような数列で構成されています。 3, 4, 33, 34, 43, 44, 333, 334, 343, 344, … 入力例 N = 6 出力例 44 説明 この記数法の数列は「3, 4, 33, 34, 43, 44, …」の順に並んでいるため、6番目の数は 44 となります。 解法アプローチ 実は、この記数法は2進数と非常によく似た構造を持っています。違いは、2進数の「0」が「3」に、「1」が「4」に置き換えられている点だけです。ここでは、この変換後の表
-
C++で同じ数字の組み合わせから「次に大きい数」を求める方法
この記事では、与えられた数値 N に対して、「同じ数字の組み合わせを使って表せる数のうち、N より大きい最小の数」を求める方法を解説します。これはいわゆる「次の順列(next permutation)」を求める問題として知られています。 問題を理解するための例 入力 N = 92534 出力 92543 「92534」と同じ数字 {9, 2, 5, 3, 4} を使って作れる数の中で、92534 より大きい最小の数は 92543 です。 解法のアプローチ 次に大きい数を求めるためのシンプルな手順は以下の通りです。 数値を最下位桁から最上位桁へ向かって走査し、「現在の桁が左隣の桁より大きい
-
C++で次の回文素数を見つける方法【効率的なアルゴリズムを解説】
問題概要 この記事では、与えられた整数 N に対して「N より大きい最小の回文素数」を求めるアルゴリズムを、C++ の実装例とともに解説します。 問題の定義: N より大きい数の中から、素数でありかつ回文数でもある最小の数を見つけます。 回文数とは、左から読んでも右から読んでも同じ数字の並びになる数のことです(例:121、12321)。 素数とは、約数が 1 とその数自身のみである数のことです。 入出力例で理解する 入力 N = 12 出力 101 説明 12 より大きい回文数は 22, 33, 44, 55, 66, 77, 88, 99, 101 … と続きます。このうち最初の素数は 1