-
数値のすべての桁で割り切れるかどうかを判定するCプログラム
概要 整数 n が与えられたとき、その数値を構成するすべての桁が n を割り切るかどうかを判定します。つまり、数値が「xy」と表される場合、x と y の両方とも n を割り切れる必要があります。 サンプル 入力: 24 出力: Yes(はい) 説明: 24 % 2 == 0、24 % 4 == 0 となるため、構成する桁である 2 と 4 の両方が 24 を割り切ることができます。 アルゴリズムの考え方 条件分岐を使用しながら、各桁について次の 2 点を順番に確認していきます。 その桁の値が 0 ではないこと(0 による除算はエラーになるため) その桁の値で元の数値が割り切れること 具体
-
C言語で文字列の長さを求めるプログラムの書き方を解説
C言語において、文字列とは実際にはヌル文字「\0」で終端される1次元の文字配列のことです。そのため、ヌル終端文字列には、文字列を構成する文字の後にヌル文字が続く形でデータが格納されています。文字列の長さを求めるには、ループ処理を用いて「\0」文字が見つかるまで先頭から文字数を数えていく必要があります。具体例入力 − naman出力 − 文字列の長さは 5解説 − 文字列の各インデックスを先頭から順に走査し、文字列の終端を意味するヌル文字「\0」に到達するまで処理を繰り返します。サンプルコード#include <stdio.h> #include <string.h>
-
2つの浮動小数点数を乗算するCプログラムの書き方
「float」は「floating-point(浮動小数点)」の略称です。定義上、floatはコンパイラに組み込まれた基本データ型の一つで、小数点の位置が固定されない数値(浮動小数点数)を扱うために使用されます。浮動小数点型の変数とは、4320.0、-3.33、0.01226のような実数を格納できる変数のことです。「浮動小数点」という名前の「浮動」の部分は、小数点が「浮く」ことができることを意味します。つまり、小数点の前後の桁数が可変であることを表しています。整数型では小数点以下を表現できませんが、浮動小数点型を使えば幅広い範囲の実数を柔軟に扱えます。浮動小数点型の種類分類型最小サイズ一般的な
-
C/C++でn番目のカタラン数を求めるプログラム
カタラン数(Catalan numbers)とは、組み合わせ論におけるさまざまな数え上げ問題に現れる自然数の数列です。特に、再帰的に定義される対象の個数を数える場面で頻繁に登場することで知られています。カタラン数の主な性質ディック語(Dyck word)との関係Cn は、長さ 2n のディック語の総数を表します。ディック語とは、n 個の X と n 個の Y から構成され、文字列のどの先頭部分を見ても Y の数が X の数を超えない文字列のことです。例えば、長さ 6 のディック語は次の通りです。XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY.正しい括弧の対応付けX を開き
-
【C言語】再帰関数でハノイの塔を解くプログラムの書き方
ハノイの塔(Tower of Hanoi)は、フランスの数学者エドゥアール・リュカが考案したとされる有名な数学パズルです。3本の棒と、大きさの異なる複数の円盤を使用し、円盤はどの棒にも自由に差し込める構造になっています。初期状態では、1本の棒に円盤が小さいものが一番上になるよう昇順にきれいに積み重ねられており、この同じ積み方を3本目の棒で再現することがゴールとなります。 パズルの目的は、以下のシンプルなルールを守りながら、円盤の山全体を別の棒へ移動させることです。 一度に動かせるのは1枚の円盤のみ。 移動とは、ある山の一番上の円盤を取り、別の山の一番上に載せることを意味します。つまり、各山の
-
C言語プログラミングで算術平均を求める方法を徹底解説
算術平均とは算術平均(相加平均)とは、数値の集合の合計を、その集合に含まれる数値の個数で割った値のことです。算術平均の基本的な性質n個の数 x1, x2, …, xn の平均が x であるとき、各観測値に p を加えると、新しい平均は (x + p) になります。n個の数 x1, x2, …, xn の平均が x であるとき、各観測値から p を引くと、新しい平均は (x - p) になります。n個の数 x1, x2, …, xn の平均が x であるとき、各観測値に 0 以外の数 p を掛けると、新しい平均は px になります。n個の数 x1, x2, …, xn の平均が x であるとき、
-
C++プログラミング:配列の合計を偶数にするための最小の数を求める方法
問題の概要与えられた配列に対して、0より大きい最小の数を1つ追加し、配列全体の合計を偶数にする方法を解説します。入出力例入力: 1 2 3 4出力: 2説明: 配列の合計は10で偶数です。偶数の合計を維持するには、最小でも2を追加する必要があります(1を追加すると合計が奇数になってしまうため)。方法1:配列の合計を計算して判定する配列の全要素の合計を計算します。合計が偶数であれば追加する最小の数は2、奇数であれば1となります。入出力例入力: 1 2 3 4出力: 2説明: 配列の合計は10なので、合計を偶数に保つために最小の数2を追加します。サンプルコード#include<iostrea
-
【Cプログラミング】配列内の数値の平均値を求める方法|反復処理と再帰処理の2つのアプローチ
配列には n 個の要素が格納されており、この記事ではそれらの数値の平均値を求めるプログラムを、異なる2つの方法で紹介します。 なお、サンプルコードでは説明を分かりやすくするためにC++の標準入出力(cout)を使用していますが、平均値を求めるロジック自体はC言語でも同じ考え方で実装できます。 入力:1 2 3 4 5 6 7 出力:4 解説:配列要素の合計は 1+2+3+4+5+6+7=28 となり、配列の要素数は7です。 したがって、平均値 = 28 ÷ 7 = 4 となります。 平均値の求め方には、主に次の2つの方法があります。 方法1:反復処理(ループ) この方法では、まずループを使って
-
C/C++の配列とは?宣言・初期化・要素へのアクセス方法を徹底解説
配列(Array)とは、同じ型の要素を連続的に並べてまとめたデータ構造です。配列は複数のデータを一括して格納するために使われますが、実務上は「同じ型の変数をまとめた集合」と捉えると理解しやすくなります。例えば、number0、number1、…、number99 のように個別の変数を100個宣言する代わりに、numbers という1つの配列変数を宣言し、numbers[0]、numbers[1]、…、numbers[99] として個々の変数を表すことができます。配列内の特定の要素には、インデックス(添字)を使ってアクセスします。すべての配列はメモリ上の連続した領域で構成されています。先頭の要素
-
C/C++で放物線の頂点・焦点・準線を求めるプログラム
平面上の点の集合のうち、曲線上の任意の点が中心にある1つの定点(これを焦点と呼びます)から常に等しい距離を保つように形成される曲線を放物線といいます。放物線の一般方程式は次のとおりです。y = ax2 + bx + c頂点とは、放物線が最も鋭く方向転換する点の座標のことです。また、係数 a は曲線の開き具合を決める重要な値となります。焦点は、放物線上のすべての点から等距離にある点です。さらに、焦点と対になる概念として準線(directrix)と呼ばれる直線があり、放物線上の各点は焦点までの距離と準線までの距離が等しくなるという性質を持ちます。この記事では、放物線の頂点・焦点・準線を求める方法を
-
n枚のコインで作れるピラミッドの最大の高さを求めるC/C++プログラム
この記事では、n枚のコインを使って作れるピラミッドの最大の高さを求める方法と、そのC/C++による実装例を解説します。 問題の概要 n枚のコインが与えられ、それらを最大の高さになるようにピラミッド状に積み上げます。配置のルールは以下のとおりです。 1段目(最上段)には1枚目のコインを置く 2段目には2枚目・3枚目のコインを置く 以降も同様に、k段目にはk枚のコインを置く たとえば次の図のように、6枚のコインで高さ3のピラミッドが完成します。高さ4にするためには合計10枚のコインが必要になります。 高さを求める公式 k段目までに必要なコインの総数は「三角数」と呼ばれ、次の式で表されます。
-
モジュラ方程式 A mod X = B の解の個数を求める C/C++ プログラム
モジュラ方程式とは 数学におけるモジュラ方程式(modular equation)とは、モジュライ問題の意味での「モジュライ(moduli)」が満たす代数方程式のことです。つまり、モジュライ空間上に定義された複数の関数が与えられたとき、それらの間で成り立つ方程式、言い換えればモジュライに関する恒等式を指します。 この用語は、特に楕円曲線のモジュライ問題との関連で使われることが最も多いです。この場合、モジュライ空間自体の次元は1であるため、モジュラー曲線の関数体に属する任意の2つの有理関数 F と G は、複素数体上の2変数非零多項式 P によるモジュラ方程式 P(F, G) = 0 を必ず満た
-
奇偶転置ソート(ブリックソート)をC/C++で実装する方法
奇偶転置ソート(ブリックソート)は、バブルソートとよく似たソートアルゴリズムの一つです。この手法は「奇数フェーズ」と「偶数フェーズ」の2つのフェーズから構成されており、すべての要素が整列されるまで、各反復ごとに両方のフェーズが交互に実行されます。奇数フェーズでは、バブルソートと同じ要領で比較と交換を行いますが、対象となるのは奇数番目のインデックスを持つ要素だけです。同様に、偶数フェーズでは偶数番目のインデックスを持つ要素のみが処理されます。概念をより分かりやすくするために、具体的な例を見てみましょう。入力:a[]={3,5,7,6,1,4,2} 出力:1 2 3 4 5 6 7アルゴリズムの解
-
三角マッチ棒数を求めるC/C++プログラムの解説と実装例
三角マッチ棒数とはマッチ棒を正三角形の形に並べて作った三角形のことを「三角マッチ棒数(Triangular Matchstick Number)」と呼びます。三角マッチ棒数とは、そのマッチ棒の三角形を作るために必要なマッチ棒の本数を指します。問題の概要この問題では、マッチ棒で作るピラミッドの段数 X が与えられます。そして、X 段のマッチ棒ピラミッドを構成するために必要なマッチ棒の最小総本数を出力するプログラムを作成するのが課題です。概念をより明確にするために、具体例を見てみましょう。入力: 7 出力: 84解法の考え方この問題は、三角数(Triangular Number)の拡張として考える
-
配列の全要素から作れる数が3で割り切れるかどうかを判定するC/C++プログラム
ある数が3で割り切れるかどうかを調べるには、その数を構成する各桁の数字をすべて足し合わせ、その合計が3で割り切れるかを確認します。これが有名な「3の倍数判定法」です。本記事では、整数型の配列 arr[] が与えられたとき、これらの要素を組み合わせて作られる数が3で割り切れるかどうかを判定する方法を解説します。割り切れる数を作れる場合は「Yes」を、作れない場合は「No」を出力します。入力:arr[] = {45, 51, 90} 出力:Yes考え方この問題では、配列内の数字を並び替え・組み合わせることで、3で割り切れる数を作れるかを判定します。上記の入力例であれば、たとえば 945510 とい
-
マージソートを使って配列の転倒数(反転数)を数えるC/C++プログラム
転倒数(Inversion Count)とは?与えられた配列をソートする際に発生する反転(転倒)の回数を「転倒数(Inversion Count)」と呼びます。転倒数を求める問題は古典的なアルゴリズム問題の一つで、マージソート(Merge Sort)のアルゴリズムを応用することで効率的に解くことができます。この問題では、各要素について「自分より左側にあり、かつ自分より大きな値を持つ要素」の数をすべて数え上げ、その合計を出力します。この処理は、マージソートのマージ(merge)関数の中で実装されます。理解を深めるために、マージ処理で扱う2つの部分配列を例に考えてみましょう。配列の転倒数の定義配列
-
連続する1を含まない2進文字列の個数を数えるC/C++プログラム
2進数とは、0と1という2種類の数字のみで構成される数のことです。すべての2進数はビットの並び(ストリーム)とみなすことができ、これを「2進文字列」と呼びます。本記事では、N桁の2進文字列のうち、「1が連続して現れない」という条件を満たすものが何通りあるかを求める方法を解説します。例えば、N = 5 の場合、条件を満たす2進文字列は以下の13通りになります。00000, 00001, 00010, 00100, 00101, 01000, 01001, 01010, 10000, 10001, 10010, 10100, 10101アプローチ1:全列挙による方法一つ目の方法は、N桁のすべての2
-
整数のセットビットをカウントするC/C++プログラム
セットビットのカウントとはセットビットのカウントとは、与えられた整数を2進数で表現したときに含まれる「1」の個数を数えることを意味します。これを実現する方法はいくつかありますが、ここでは整数のバイナリ表現を対象に、各ビットを走査して1の数を数える基本的な手法を紹介します。たとえば、入力として17を与えた場合、17の2進表現は「10001」であり、1が2つ含まれるため、出力は2になります。入力:正の整数を入力してください:6 出力:2アルゴリズムの解説6の2進表現は「110」であり、セットビット(1になっているビット)は2つ存在します。この反復的なアプローチでは、1ビットにつき1回の反復が必要に
-
C/C++で数の一意な素因数の積を求めるプログラム
一意な素因数とは一意な素因数(ユニークな素因数)とは、ある数の約数の中で、それ自体が素数であるものを指します。本記事では、与えられた整数に対して、重複しないすべての素因数を掛け合わせた積を求める方法を解説します。なお、素数とは「1とその数自身」の2つしか約数を持たない数のことです。問題を例で理解するまず、具体的な例を使って問題を整理しましょう。例として n = 1092 を考えます。この数の一意な素因数の積を求めます。1092 の素因数:2、3、7、13これらの積:2 × 3 × 7 × 13 = 546Input: n = 10 Output: 10出力の説明入力された数は 10 です。10
-
C/C++で配列の全要素の積をnで割った余りを求めるプログラム
配列乗算の問題では、与えられた配列の全要素の積を計算し、その積を指定された数値nで割った余りを求めます。具体的な例を使って見ていきましょう。 入力: arr[] = { 12, 35, 69, 74, 165, 54 } N = 47 出力: 14 解説 配列が {12, 35, 69, 74, 165, 54} の場合、全要素の積は次のように計算されます。 (12 × 35 × 69 × 74 × 165 × 54) = 19107673200 この積を47で割ると、余りは14になります。これが出力として期待される値です。 素朴なアプローチの課題 最も単純な考え方は、すべての要素