-
配列内の素数と非素数の合計の絶対差を求める方法
はじめに本記事では、配列内のすべての素数の合計と、すべての非素数(合成数)の合計の差を求め、その絶対値を計算する方法を解説します。この問題を解くためには、まず各数値が素数かどうかを判定する必要があります。素数判定の基本的なアプローチとしては、「対象の数が 2 からその平方根までのいずれの整数でも割り切れないこと」を確認する方法があります。この方法では、1つの数値の判定に O(√n) の時間計算量が必要です。アルゴリズムdiffPrimeNonPrimeSum(arr)begin sum_p := arr 内のすべての素数の合計 sum_np := arr 内のすべての非素数の合
-
ソート済み配列における絶対値の異なる要素数を数える方法
この記事では、配列内の要素のうち、絶対値が異なる要素がいくつあるかを数える方法を解説します。例えば、配列に {5, 5, 6, -5, 8, 2, -2, 1} という8つの要素が含まれているとします。しかし、絶対値で見ると {5, 6, 8, 2, 1} の5種類しか存在しません。-5 と 5 は符号が異なるだけで、絶対値としては同じ値であるため、別々の要素とはみなされません。この問題を解決するには、Set(セット)データ構造を利用するのが効果的です。セットには重複した要素を格納できないという特性があります。そこで、配列の各要素をセットに挿入する際に、絶対値に変換してから挿入することで、自動
-
C/C++プログラムで放物線の頂点・焦点・準線を求める方法
この記事では、C言語またはC++のプログラムを使って、放物線の頂点・焦点・準線(ダイレクトリックス)を求める方法を解説します。これらのパラメータを計算するには、放物線の一般方程式が必要です。一般式は次のとおりです。y = ax2 + bx + cここで、係数 a、b、c の値はあらかじめ与えられているものとします。各パラメータを求める公式頂点(Vertex)放物線の頂点は、次の座標で表されます。x = −b / (2a)y = (4ac − b2) / (4a)焦点(Focus)焦点は、頂点より 1/(4a) だけ上に位置します(a > 0 の場合)。x = −b / (2a)y = (
-
C/C++による奇偶転置ソート(ブリックソート)の実装プログラム
ここでは、ブリックソート(Brick Sort/奇偶転置ソート)の仕組みについて詳しく解説します。ブリックソートは、バブルソートを改良したソートアルゴリズムの一つで、処理全体が「奇数フェーズ」と「偶数フェーズ」という2つのステップに分かれているのが特徴です。奇数フェーズでは、奇数番目のインデックス(1, 3, 5, ...)にある要素同士を比較・交換し、偶数フェーズでは、偶数番目のインデックス(0, 2, 4, ...)にある要素同士を比較・交換します。この2つのフェーズを、配列全体がソート済みになるまで繰り返します。隣接する要素を独立して並列処理できるため、並列化に適したアルゴリズムとしても
-
【C/C++】数の一意な素因数の積を効率的に求めるプログラム
この記事では、ある整数の一意な素因数(重複を除いた素因数)の積を効率的に求める方法を解説します。例として n = 1092 を考えてみましょう。1092 を素因数分解すると 2 × 2 × 3 × 7 × 13 となり、一意な素因数は {2, 3, 7, 13} です。したがって、その積は 2 × 3 × 7 × 13 = 546 となります。 アルゴリズムの考え方 この問題を解くには、以下の手順に従います。 数が 2 で割り切れる場合は、積に 2 を掛けたうえで、数が 2 で割り切れなくなるまで繰り返し 2 で割ります。これにより、以降の 2 はすべて無視されます。 この時点で数は必ず奇数
-
C/C++で配列要素の積をnで割った余りを求めるプログラム
ここでは、配列の全要素を掛け合わせた結果をnで割った余り(剰余)を計算する方法を解説します。配列とnの値はユーザーから与えられるものとします。例えば、配列が {12, 35, 69, 74, 165, 54} の場合、積は (12 × 35 × 69 × 74 × 165 × 54) = 19107673200 となります。この値を47で割った余りは14です。一見するとこの問題は非常にシンプルです。すべての要素を掛け合わせてから、モジュロ演算子(%)を使えば答えが得られます。しかし、ここに落とし穴があります。積を計算する過程で、その値がint型やlong型の表現範囲を超えてしまう可能性があるの
-
キャリーを伝播させずに2つの数値を加算する方法
本記事では、キャリー(繰り上がり)を伝播させずに、n桁の2つの数値を加算するという興味深い問題を取り上げます。通常の足し算では、ある桁での和が10以上になると繰り上がりが発生し、次の桁へ伝播します。しかし今回は、各桁ごとに単純に数字を加算し、その結果をそのまま並べるだけの計算を行います。具体例を見てみましょう。例えば、7583 + 9642 をキャリーなしで計算すると、次のようになります。最上位桁:7 + 9 = 16次の桁:5 + 6 = 11次の桁:8 + 4 = 12最下位桁:3 + 2 = 5これらを左から順に並べると、答えは 1611125 となります。解法のポイントこの問題には一つ
-
C++におけるsizeofとalignofの違いとは?
この記事では、C++におけるsizeof演算子とalignof演算子の違いについて詳しく解説します。なお、alignof()演算子はC++11で新たに導入されたものです。 sizeofとalignofの基本的な役割 alignof()演算子は、指定した型のアライメント(メモリ上の境界調整)をバイト単位で取得するために使用されます。オペランドには、完全型(complete type)または参照型を指定する必要があります。 一方、sizeof()演算子は、型が占めるメモリサイズ(バイト数)を返します。こちらはC言語の時代から存在する古典的な演算子です。 通常の組み込みデータ型(intやdoub
-
反復法を使って文字列のすべての順列を生成する方法
この記事では、文字列のすべての順列(パーミュテーション)を求める方法を解説します。順列の生成には一般的に再帰呼び出しとバックトラッキングを組み合わせた手法がよく知られていますが、ここでは反復(イテレーション)のみを用いたアプローチを紹介します。たとえば、文字列「ABC」のすべての順列は {ABC, ACB, BAC, BCA, CAB, CBA} の6通りです。処理の流れを正確に理解するために、まずアルゴリズムから見ていきましょう。アルゴリズムgetAllPerm(str)begin 文字列の文字を昇順にソートする while true, d
-
座標軸と直線で囲まれる三角形の面積の求め方|公式の導出とC++実装例
座標軸と直線で囲まれる三角形の面積の求め方ここでは、x軸・y軸という2つの座標軸と、もう1本の直線によって形成される三角形の面積を求める方法を解説します。全体のイメージは下図のとおりです。直線の方程式は次の形で表されます。𝑎𝑥+𝑏𝑦+𝑐=0この直線はx軸と点Bで交わり、y軸と点Aで交わります。原点Oと点A・点Bを結ぶことで、直角三角形OABができます。切片形式への変形まず、直線の方程式を切片形式に変形してみましょう。これにより、x切片は −𝑐∕𝑎、y切片は −𝑐∕𝑏 であることが分かります。三角形の面積は「底辺 × 高さ ÷ 2」で求められるので、底辺を|x切片|、高さを|y
-
C/C++における引数の型強制(Argument Coercion)とは?仕組みとサンプルコードで解説
本記事では、C言語およびC++における「引数の型強制(Argument Coercion)」について解説します。引数の型強制とは、関数に渡された引数の型を、コンパイラがある型から別の型へ自動的に(暗黙的に)変換する仕組みのことです。この変換は「引数の昇格ルール(argument promotion rule)」に従って行われます。つまり、より小さいデータ型の引数は、より大きいデータ型へと変換されますが、その逆の変換は行われません。なぜなら、大きなデータ型から小さなデータ型へ変換すると、データの一部が失われる(桁あふれや精度の低下が発生する)恐れがあるためです。暗黙的な型変換がどのように行われる
-
与えられた数値を並べ替えて最大の数を作る方法|C++での実装例
この記事では、与えられた複数の数値を並べ替えて、可能な限り大きな数を作る方法を解説します。例えば、{45, 74, 23} という3つの数値が与えられた場合、プログラムは最大の数「744523」を出力します。ここで重要なのは、各桁の数字をバラバラに並べ替えるのではなく、数値そのものをひとまとまりの単位として配置するという点です。 この問題を解くには、数値を文字列として扱い、ソートを行います。ただし、通常の大小比較とは異なる独自の比較ロジックを使用します。比較関数は2つの数値 a と b を受け取り、それぞれを連結した「ab」と「ba」を生成し、どちらが大きいかを判定します。大きい方の組み合わ
-
C/C++におけるASCII NUL・文字'0'・数値リテラル0の違いを解説
はじめに本記事では、C/C++プログラミングにおいて混同されやすい3つの値――ASCII NUL、文字リテラル0、そして数値リテラル0――の違いについて詳しく解説します。一見するとどれも「ゼロ」に見えますが、内部的な値も役割もまったく異なるため、正しく理解しておくことが重要です。それぞれの値の正体ASCII NULは16進数で0x00として表現されます。一方、文字としての「0」(0)は、ASCIIコード表の中で0x30に割り当てられており、10進数に直すと48になります。ASCII NUL文字(\0)には特別な役割があります。C言語やC++では、文字列の終端を示すためにこのNUL文字が使われま
-
最初のn個の奇数の自然数の平均を求める方法
この記事では、最初のn個の奇数の自然数の平均を求める方法を解説します。nの値はユーザーから入力として受け取ります。ここで重要になるのが、i番目の奇数を表す式「2i+1」です。例えば、i=0なら1、i=1なら3、i=2なら5というように、この式を使えば奇数を順番に生成できます。各奇数をすべて合計し、最後にnで割ることで平均が求められます。それでは、処理の流れを明確にするためにアルゴリズムを見ていきましょう。アルゴリズムavgOddNaturalNumber(n)Begin sum := 0 for i in range 0 to n-1, do sum := sum +
-
文字列内の各文字のASCII値の平均を求める方法
本記事では、与えられた文字列に含まれる各文字のASCII値の平均を計算する方法を解説します。例として、文字列が「ABC」である場合を考えてみましょう。各文字のASCII値はそれぞれ65(A)、66(B)、67(C)となるため、これら3つの値の平均は66になります。アルゴリズムasciiAverage(String)Begin sum := 0 for each character c in String, do sum := sum + ASCII of c done return sum/length of String End実装例(C++)
-
Bashプログラムで数値が回文かどうかを確認する方法
数値が回文(パリンドローム)であるかどうかを確認するには、まずその数値を逆順に並べ替えます。そして、元の数値と逆順にした数値が一致すれば、それは回文です。例えば「12321」は逆から読んでも「12321」となるため、回文であると言えます。Bashでは、この反転処理を非常に簡単に行うことができます。revコマンドを使えば、標準入力として渡されたテキスト(数値を含む)を1行ごとに逆順に出力してくれます。実際に、echoで数値を出力し、パイプ(|)を使ってrevコマンドへ渡すことで、逆順の数値を取得できます。それでは、具体的なプログラムを見てみましょう。サンプルコード#!/bin/bash # GN
-
BashスクリプトでAのB乗(べき乗)を計算する方法
この記事では、Bashスクリプトを使って数値AのB乗(べき乗)を求める方法を解説します。 ロジックは非常にシンプルです。Bashでは、べき乗演算子である「**」を使用することで、累乗の計算が簡単に行えます。特別なライブラリや外部コマンドを用意する必要はなく、算術展開の中に演算子を記述するだけで実現できます。 それでは、実際のコード例を見ていきましょう。以下のプログラムは、変数aに5、変数bに6を代入し、「$a ** $b」つまり5の6乗を計算して出力するものです。 サンプルコード #!/bin/bash # GNU bash スクリプト a=5 b=6 echo $(($a ** $b)) 実
-
同じサイズの2つのソート済み配列の中央値を求めるC/C++プログラム
本記事では、同じサイズを持つ2つのソート済み配列から中央値を求める方法を解説します。配列要素の格納にはC++のSTL(標準テンプレートライブラリ)を使用します。2つの配列を受け取ったら、それらを1つにマージします。同じサイズの配列同士を結合すると、最終的な配列は必ず偶数個の要素を持つことになります。そのため、中央の2つの要素を取り出し、その平均値を中央値として計算します。アルゴリズムmedian(arr1, arr2)Begin arr3 := arr1とarr2をマージした後の配列 arr3をソートする len := arr3の長さ mid := len/2
-
C言語で複利を計算するプログラムの作成方法
この記事では、C言語を使って複利(compound interest)を計算するプログラムの書き方を解説します。ロジックは非常にシンプルで、初心者の方でも理解しやすい内容となっています。複利計算に必要なパラメータ複利を求めるためには、以下の3つのパラメータが必要です。P − 元金(最初に預ける・借りる金額)R − 年利率(パーセント単位)T − 期間(年数)複利の計算式複利は以下の数式で求められます。複利 = P × (1 + R/100)Tこの式では、利率を100で割って小数に変換し、1に加えた値を期間T乗することで、元利合計(元金+利息)を計算しています。サンプルコード以下が実際のC言語プ
-
C言語で最初のn個の自然数の立方和を求めるプログラム
この記事では、最初のn個の自然数(1からnまで)の立方和を求める方法について解説します。基本的なアプローチとしては、1からnまで繰り返すforループを1つ使い、各ステップでその項の立方を計算して合計に加算していきます。この方法の計算量はO(n)です。しかし、O(1)つまり定数時間でこの問題を解きたい場合は、以下の級数の公式を利用できます。1³ + 2³ + 3³ + … + n³ = {n(n+1)/2}²アルゴリズムcubeNNatural(n)begin sum := 0 for i in range 1 to n, do sum := sum + i^3