-
C++で級数 1+(1+2)+(1+2+3)+…+(1+2+3+…+n) の総和を求める方法
問題概要 この問題では、数値 n が与えられます。求めるのは、次の級数の総和です。 1 + (1+2) + (1+2+3) + (1+2+3+4) + … + (1+2+3+4+…+n) 入力例と出力例 入力: n = 4 出力: 20 説明: (1) + (1+2) + (1+2+3) + (1+2+3+4) = 20 解法1: 二重ループを使う単純な方法 最もシンプルな解法は、外側のループで各項を順に生成し、内側のループでその項の値を計算して加算していく、二重ループを用いる方法です。 アルゴリズム sum を 0 で初期化する ステップ1: i を 1 から n までループする(i = 1
-
C++で級数 1 + (1+3) + (1+3+5) + … + (1+3+5+…+(2n−1)) の合計を求める方法
問題概要この問題では、整数 n が与えられ、以下の級数の合計を求めるプログラムを作成します。1 + (1+3) + (1+3+5) + (1+3+5+7) + … + (1+3+5+7+…+(2n−1))この級数をよく観察すると、i 番目の項は「最初の i 個の奇数の和」になっていることがわかります。例題で理解を深めよう入力:n = 3出力:14説明: (1) + (1+3) + (1+3+5) = 14解法1:二重ループを使うシンプルなアプローチ最も直感的な解決策は、二重ループ(ネストされたループ)を使い、各項の奇数を順番に合計変数へ加算していき、最後に合計を返す方法です。サンプルコード#i
-
C++で級数 1 + x/1 + x²/2 + x³/3 + … + xⁿ/n の総和を求めるプログラム
この問題では、2つの数値 x と n が与えられます。これらは数学的な級数を表しており、私たちのタスクは、級数「1 + x/1 + x2/2 + x3/3 + … + xn/n」の総和を求めるプログラムを作成することです。 例を使って問題を理解しよう 入力 x = 2 , n = 4 出力 11.666 解説 − sum = 1 + 2/1 + (2^2)/2 + (2^3)/3 + (2^4)/4 = 1 + 2 + 4/2 + 8/3 + 16/4 = 1 + 2 + 2 + 8/3 + 4 = 9 + 8/3 = 11.666 解決アプローチ 最もシンプ
-
C++で三角数の級数(1、3、6、10…)の合計を求める方法
この問題では、級数 1、3、6、10…(三角数)の要素数 n が与えられ、この級数の合計を計算するプログラムを作成することが求められます。合計を計算する前に、まず三角数についておさらいしておきましょう。三角数とは?三角数とは、三角形の形で表すことができる数のことです。三角形は、1行目に1個の点、2行目に2個の点、3行目に3個の点…というように配置することで構成されます。このとき、点の総数が三角数となります。具体例で問題を理解しよう入力:n = 4出力: 20説明: sum = T1 + T2 + T3 + T4 = 1 + 3 + 6 + 10 = 20方法1:ループを使ったシンプルな解法この
-
C++で級数 1/(1*2) + 1/(2*3) + 1/(3*4) + … の総和を求める方法
この問題では、級数「1/(1*2) + 1/(2*3) + … + 1/(n*(n+1))」の第 n 項までの項数 n が与えられます。私たちのタスクは、この級数の総和を求めるプログラムを作成することです。 例で問題を理解しよう 入力 n = 3 出力 0.75 説明 − 総和 = 1/(1*2) + 1/(2*3) + 1/(3*4) = 1/2 + 1/6 + 1/12 = (6+2+1)/12 = 9/12 = 3/4 = 0.75 この問題に対する最もシンプルな解決策は、ループを使用する方法です。級数の各要素の値を順番に計算し、それらを合計値に加算していきます。 アルゴリズム sum
-
C++で再帰を使って級数1² + 2² + 3² + … + n²の総和を求める方法
本記事では、級数 1² + 2² + 3² + … + n² の第 n 項までの総和を求める問題を取り上げます。数値 n が与えられたとき、この級数の合計を計算するプログラムを C++ で作成します。まず反復処理(ループ)による基本的な解法を確認し、その後、再帰を使った実装方法も詳しく解説します。 問題を理解するための例 入力: n = 4 出力: 30 説明: sum = (1 × 1) + (2 × 2) + (3 × 3) + (4 × 4) = 1 + 4 + 9 + 16 = 30 アルゴリズム(反復処理) 最もシンプルな解法は、1 から n まで順に各数値の 2 乗を求め、合計
-
C++で級数 2+(2+4)+(2+4+6)+…+(2+4+6+…+2n) の総和を求める方法
この記事では、級数 2 + (2+4) + (2+4+6) + (2+4+6+8) + ... + (2+4+6+8+...+2n) の第 n 項を表す数値 n が与えられたとき、その級数の総和を求めるプログラムを C++ で作成する方法を解説します。 問題を理解するための例 入力: n = 3 出力:20 説明:sum = (2) + (2+4) + (2+4+6) = 2 + 6 + 12 = 20 解法1:二重ループを使うシンプルな方法 最も基本的な解法は、ネストされたループ(二重ループ)を使用する方法です。内側のループで級数の i 番目の項(2 から 2i までの偶数の和)を計算し、そ
-
C++でN×Nチェス盤に配置できるビショップの最大数を求める方法
問題概要チェス盤のサイズを表す整数 N が入力として与えられます。この問題では、任意の N に対して、N×N のチェス盤上に互いに攻撃し合わないようにビショップ(bishop)を最大何個配置できるかを求めます。まず、具体例を使って理解していきましょう。例1入力: N = 2出力: N×N チェス盤に配置できるビショップの最大数 ― 2説明: 2×2 のチェス盤の場合、互いに干渉しない位置は図示された場所のみです。つまり、2×2 の盤面に配置できるビショップは最大 2 個となります。例2入力: N = 5出力: N×N チェス盤に配置できるビショップの最大数 ― 8プログラムで使用するアプローチ
-
C++で循環配列内の連続する1(または0)の最大数を求める方法
本記事では、循環配列(サーキュラー配列)を扱います。循環配列とは、最初の要素が最後の要素の直後に続くものとみなす配列のことで、キューの実装などによく利用されます。ここでは、このような配列の中で連続して現れる「1」または「0」の最大個数を数える方法を解説します。 具体的な例で確認してみましょう。 入力 − Arr[] = { 1,1,0,1,0,1,0,1,1,1 } 出力 − 連続する「1」の最大数は5。連続する「0」の最大数は1。 説明 − 配列のインデックス7から9、さらにインデックス0と1にまたがって「1」が5個連続しています。一方、「0」は連続して現れず、最大でも1個です。 入力 −
-
【C++】文字列内で最も長く連続して繰り返される文字を見つける方法
アルファベットからなる文字列が与えられます。この課題では、文字列の中で最も長く連続して繰り返されている文字を見つけます。具体的な例を通じて確認していきましょう。入力例と出力例入力: String[] = abbbabbbbcdd出力: b説明: この文字列において、最も長い連続シーケンスを持つのは文字「b」で、連続する「b」は4個です。入力: String[] = aabbcdeeeeed出力: e説明: この文字列において、最も長い連続シーケンスを持つのは文字「e」で、連続する「e」は5個です。プログラムで使用しているアプローチアルファベットの文字列は、文字配列 string1[] に格納し
-
C++で配列内の連続する素数の最大数を求める方法
本記事では、ランダムな順序で並んだ整数の配列(サイズ N)の中から、連続して出現する素数の最長列を見つける方法を解説します。素数と非素数が混在する配列を走査し、最も長く続いた素数の個数を求めるのが目標です。素数とは、1とその数自身という2つの約数しか持たない数のことです。1、2、3、5、7、11、13などは素数であり、一方で4、6、8、9、10などの合成数は2つより多くの約数を持ちます。それでは、具体例で確認してみましょう。入力例と出力例入力 − Arr[] = { 1,3,5,2,6,7,13,4,9,10 }出力 − 3説明 − この配列に含まれる素数は 3,5,2,7,13 です。このう
-
C++で合計が偶数となる最大長の部分配列を求める方法
整数型の配列 Arr[] が与えられたとき、要素の合計が偶数となる最長の部分配列の長さを求めるのが本記事の目的です。つまり、部分配列内の要素をすべて足した値が偶数になり、かつその長さが最大となる部分配列を探します。 入力例と出力例 入力 − Arr[] = { 2, 3, 5, 2, 6, 7 } 出力 − 部分配列の最大長:4 説明 − 最大長の部分配列は { 5, 2, 6, 7 } です。合計は 20 となり、偶数になります。 入力 − Arr[] = { 5, 7, 7, 3, 4 } 出力 − 部分配列の最大長:4 説明 − 最大長の部分配列は { 5, 7, 7, 3 } です。合
-
C++で木の任意の2頂点間の次数の積の合計を最大化する
問題概要 整数Nが与えられたとき、N個の頂点を持つ木を構築し、すべての順序付きペア(x, y)(ただしx ≠ y)に対する degree(x) × degree(y) の合計が最大になるようにするのが本記事の目的です。 入力: N = 5 出力: 50 計算例 葉の数を最小限に抑えた木は、次のような鎖状(パス)の構造になります。 1 - 2 - 3 - 4 - 5 各頂点の次数は次のとおりです。 頂点1の次数 = 1 頂点2の次数 = 2 頂点3の次数 = 2 頂点4の次数 = 2 頂点5の次数 = 1 すべての順序付きペア(x, y)に対する次数の積は以下のように計算できます。 頂点1 =
-
C++でちょうどK個の部分配列を削除して、全要素が素数となる配列のサイズを最大化する方法
この記事では、正の整数N個で構成される配列Arr[]からちょうどK個の部分配列(連続する要素列)を削除し、残ったすべての要素が素数であり、かつ残りの配列のサイズが最大となるようにする問題を解説します。 問題の例 入力 Arr[]={4, 3, 3, 4, 3, 4, 3} , K=2 出力 3 説明 K=2であるため、削除できる部分配列は2個だけです。ここでは、Arr[0]とArr[3…5]の2つの部分配列を削除します。その結果、残る配列はArr[]={3,3,3}となり、すべての要素が素数で、サイズも最大になります。 入力 Arr[]={7, 6, 2, 11, 8, 3, 12}, K=
-
C++で配列内の連続する自己同形数の最大個数を求める方法
問題の概要 N個の要素からなる配列が与えられたとき、その中で連続して現れる自己同形数の最大個数を求めるのが本記事のテーマです。 まず、自己同形数(Automorphic Number)とは何かを確認しましょう。自己同形数とは、その数を2乗した結果(平方数)の下位の桁が、元の数と一致する数のことです。例えば、5は5×5=25となり、25の下一桁が「5」で元の数と一致するため、自己同形数です。 入力例と出力例 入力: arr[] = {5, 3, 625, 6, 8, 1} 出力: 2 説明: この配列に含まれる自己同形数は「5」「625」「6」「1」ですが、隣り合って連続している自己同形数の中で
-
C++で級数2^0 + 2^1 + 2^2 + ... + 2^nの総和を求める2つの方法
問題の概要この問題では、級数 2^0、2^1、2^2、…、2^n の第 n 項を表す数値 n が与えられます。求めるのは、級数 2^0 + 2^1 + 2^2 + … + 2^n の総和を計算するプログラムです。入力例と出力例入力:n = 6出力: 127計算過程:sum = 2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 = 1 + 2 + 4 + 8 + 16 + 32 + 64 = 127解法1: ループを使った素直なアプローチ最もシンプルな解決策は、ループを使用する方法です。0 から n までの各値 i について 2^i を計算し、順に合計変
-
C++でM面サイコロをN回投げたときの最大出目の期待値を求める方法
問題の概要 本記事では、M面のサイコロをN回投げたときに期待できる最大の出目(ドット数)を計算する方法を解説します。 このサイコロは、1番目の面に1個、2番目の面に2個、というようにドットが描かれており、M番目の面にはM個のドットが含まれます。公平なサイコロなので、各面が出る確率はすべて 1/M です。 まずは具体例を使って、何を求めるのかを確認しましょう。 入力例と出力例 入力 − M=2, N=3 出力 − 1.875 説明 − このサイコロは2つの面 {1, 2} を持ちます。 3回投げた場合、標本空間の大きさは MN = 23 = 8 通りとなります。 {(1, 1, 1), (1,
-
C++で2種類のアイテムを含むサイズ3のグループの最大数を求める方法
問題の概要 AタイプのアイテムがN個、BタイプのアイテムがM個与えられたとき、サイズ3のグループを最大でいくつ作れるかを求めるのがこの記事の課題です。 ただし、各グループにはAとB両方のタイプのアイテムが、それぞれ少なくとも1個ずつ含まれている必要があります。 具体例で理解しよう 入力: N=3、M=5 出力: 2 説明: グループ1:Aタイプ1個+Bタイプ2個 グループ2:Aタイプ1個+Bタイプ2個 合計でAタイプ2個、Bタイプ4個を使用。 入力: N=5、M=9 出力: 4 解法のアプローチ この問題は、NとMの大小関係および合計値をもとに、次の4つのケースに分けて考えることができます。
-
C++で制約条件を満たすN×N行列における1の最大数を求める方法
問題の概要この記事では、以下の制約条件を満たすバイナリ行列(0と1のみで構成される行列)における、1の最大数を求める方法を解説します。2つの整数 N と X(X ≤ N)が与えられます。バイナリ行列のサイズは N×N とし、すべての X×X サイズの部分行列には、少なくとも1つの 0 が含まれている必要があります。具体例を使って、問題を理解しましょう。入力: N=4, X=2出力: 12説明: 条件を満たす行列は以下のようになります。1 1 1 11 0 0 11 0 0 11 1 1 1入力: N=7, X=3出力: 45解法のアプローチ1の数を最大化するには、まず行列に必要な 0の最小個数
-
【C++】与えられた長さの線分で作成できる平行四辺形の最大数を求める方法
問題概要N本の線分が与えられたとき、各線分は高々1つの平行四辺形にしか使用できないという条件のもとで、作成できる平行四辺形の最大数を求めるのがこの記事のテーマです。平行四辺形は「同じ長さの辺2本ずつ」で構成されるため、各長さの出現回数をどのように組み合わせるかが鍵となります。まず、具体例を使って問題を確認しましょう。入力: Arr[] = {8, 3, 1, 3, 8, 7, 1, 3, 5, 3}出力: 2説明: 上記の線分から作成できる2つの平行四辺形は、それぞれ「8, 1, 8, 1」と「3, 3, 3, 3」を辺とするものです。入力: Arr[] = {7, 9, 9, 7}出力: 1