-
C/C++で実装する貪欲アルゴリズム:最小コイン枚数を求めるプログラム
貪欲アルゴリズム(グリーディ法)とは、与えられた問題に対する最適解を見つけるために用いられる手法です。問題全体を一度に扱うのではなく、各段階で「その時点で最も良い選択(局所最適解)」を積み重ねていくことで、最終的に全体の最適解へ到達することを目指します。本記事では、貪欲アルゴリズムを使って、指定された金額を作るために必要なコイン・紙幣の最小枚数を求める方法を解説します。使用できる額面は { 1, 2, 5, 10, 20, 50, 100, 200, 500, 2000 } とし、これらのコイン・紙幣を何枚組み合わせれば目標の合計金額になるかを求めます。具体例例1入力 : 1231出力 : 7
-
【C/C++】基礎力が試される!トリッキーなプログラム10選
ここでは、プログラミングの基礎力を試すことのできる、ちょっと変わった(トリッキーな)プログラムを10個紹介します。面接対策や学習の復習に、ぜひ活用してください。 1. C++で引用符「」を出力するプログラム C++では、出力するテキストの開始と終了を示すために引用符(ダブルクォート)を使用します。そのため、引用符そのものを出力するには、特別なエスケープシーケンスが必要です。C++で引用符を出力するには「\」を使用します。 例 #include<iostream> using namespace std; int main() { cout<<
-
Cプログラムで配列として表された2つの数値を加算する方法
配列で表される数値とは、数値の各桁が配列の1つの要素として格納される形式のことです。たとえば、 数値234は配列では {2, 3, 4} と表されます。 このような形式で表された2つの数値を加算するには、まず最下位桁の数字同士を足し合わせ、その合計が10以上であれば繰り上げを次の桁へ伝えます。その後、配列内の次の桁へ進みながら同じ手順を繰り返し、全体の合計を求めていきます。 実際に2つの数値を加算する例を見てみましょう。 a = {2, 9, 6} b = {6, 3, 8} 出力:934 説明 − まず数値の最下位桁同士を加算します。6 + 8 = 14 となるため、ここで繰り上げが発生し
-
C++でビット演算を使って2つの符号なし整数を加算する方法
はじめにビット列として表現される符号なし整数は、2進数形式で記述されます。例えば、54の2進表現は「110110」です。ビットを用いて2つの数を加算する場合、2進数の加算ロジックに従って、それぞれの2進表現を桁ごとに足し合わせていきます。ビット加算の基本ルール0 + 0 = 01 + 0 = 10 + 1 = 11 + 1 = 0(繰り上がり = 1)具体例実際に2つの数を加算する例を見てみましょう。入力: a = 21 (10101)、b = 27 (11011)出力: 48 (110000)解説: 10101 + 11011 = 110000 となります。加算は最下位ビット(LSB)から開
-
C言語・C++における関数のアドレスとは?取得方法をわかりやすく解説
関数とは、プログラム内で特定の処理を実行するために定義されたコードのまとまり(ブロック)です。頻繁に使用されるコードを一度関数として定義しておけば、必要なときに何度でも再利用できるため、プログラマーの作業負担を軽減し、開発効率を大きく向上させることができます。アドレスとは、データやコードがメモリ上のどこに格納されているかを示す場所(メモリ位置)のことです。プログラム内のすべてのコードブロックには、それぞれ固有のメモリ位置が割り当てられています。つまり、変数やオブジェクトと同様に、関数やメソッドにもメモリアドレスが存在します。関数のメモリアドレスを取得するには、関数ポインタを使用します。具体的に
-
C言語で解く停車駅選択問題:連続しない停車駅の組み合わせ数を求める方法
問題概要 本プログラムは、n個の駅のうちr個の駅に列車を停車させる場合について、「どの2つの停車駅も隣り合わない(連続しない)」という条件を満たす停車駅の選び方が何通りあるかを求めるものです。 問題の解説 列車は地点Xから地点Yまで走行し、その区間にはn個の駅があります。このうちr個の駅に停車しますが、隣接する2つの駅に続けて停車することはできないという制約が課されています。 この条件を満たす選び方の総数は、組合せの公式を使って直接求められます。まず、停車しない(n−r)個の駅を一列に並べると、両端を含めて(n−r+1)個の「隙間」が生まれます。この隙間からr個を選んで停車駅を配置すれば、停
-
C言語で円の面積を計算する方法|公式・アルゴリズム・サンプルコードを解説
円の面積とは? 円とは、閉じた曲線で囲まれた図形のことです。円周上のすべての点は、円の内部にあるある1つの点から等しい距離にあります。この中心となる点を円の中心と呼び、中心から円周上の各点までの距離を半径と呼びます。 面積とは、閉じた図形が占める広がりの大きさを数値で表したものです。したがって、円の面積とは、円の周囲によって囲まれた内側の領域の大きさを指します。 円の面積を求める公式 円の面積は、次の公式を使って計算できます。 面積(Area)= π × r × r ここで、r は円の半径、π(パイ)は約3.14という定数です。プログラムでは、半径を入力として受け取り、この公式に当てはめて面
-
【C言語】配列の回転を実現する反転アルゴリズムの解説と実装
アルゴリズムとは、与えられた問題を解決するために順番に実行される一連の手順のことです。本記事では、配列の回転の中でも特に効率的な反転アルゴリズム(Reversal Algorithm)について詳しく解説し、実際にC言語でプログラムを作成します。 理解しておきたい基本用語 配列(Array) 配列とは、同じデータ型の複数の要素を格納するためのコンテナです。配列のサイズ(要素数)は、宣言時に固定されます。 配列の回転(Array Rotation) 配列の回転とは、配列内の要素の並び順をずらす操作のことです。たとえば左回転では、各要素のインデックスを1つ前へ移動させ、先頭の要素は末尾へ移動します。
-
Ctrl+Zで中断されないCプログラムの作り方
プログラミングにおいて、ターミナル上で動作中のプログラムが異常な挙動を示した場合、開発者はキーボード操作によってプログラムを強制的に停止させることができます。プログラムを明示的に中断するには、目的に応じた正しいショートカットキーを把握しておく必要があります。実行中のコードを終了・中断させるために使われるショートカットキーは、主に次の2種類です。Ctrl+C ― プログラムの実行を停止するために使用します。入出力(I/O)処理が完了した後、実行が中断されます。プロセスに対してSIGINTシグナルが送信され、プロセスは終了します。C言語のsignal()関数のように、このSIGINTシグナルを捕捉
-
C言語で2つのテキストファイルを比較し、不一致箇所を検出・報告する方法
C言語では、プログラマはファイルにアクセスし、その内容を読み書きすることができます。ファイルとは、情報を格納するための単純なメモリブロックであり、ここではテキストデータのみを扱います。この記事では、2つのファイルを比較して不一致(差分)を検出し、その結果を報告するプログラムを紹介します。比較対象となる2つのファイルはほぼ同じ内容ですが、一部の文字が異なる場合があります。さらに、このプログラムは最初に不一致が発生した位置の「行番号」と「行内での文字位置」も出力します。アルゴリズムファイル比較の処理は、以下の手順で行います。ステップ1:両方のファイルを読み込みモードで開き、ファイルポインタを先頭に
-
スタックの成長方向を判定するCプログラムの解説
スタック(Stack)とは、要素を格納するためのデータ構造です。スタックに対しては主に2つの操作が定義されています。push:スタックに新しい要素を追加する操作pop:スタックから要素を取り除く操作スタックは、それを使用するプログラムの性質(アーキテクチャやコンパイラの実装)に応じて、上位アドレス方向(上向き)にも下位アドレス方向(下向き)にも成長します。この記事では、C言語のプログラムを使って、実際にスタックがどちらの方向に成長するのかを判定する方法を解説します。判定のアルゴリズムスタックの成長方向は、異なる関数内のローカル変数のアドレスを比較することで判定できます。手順は以下の通りです。ス
-
C言語でIPアドレス・サブネットマスク・デフォルトゲートウェイを取得する方法
C言語を使えば、システムのインターネット接続に関する詳細情報(IPアドレス、サブネットマスク、デフォルトゲートウェイなど)を簡単に取得できます。本記事では、まず理解しておくべき基本用語を解説し、その後、実際にこれらの情報を表示するプログラムを紹介します。基本用語の解説IPアドレスとはIPアドレス(Internet Protocol Address)は、インターネットに接続される各デバイスに割り当てられる固定の数値識別子です。デバイスはこのIPアドレスを通じて、インターネット上で相互に通信を行います。サブネットマスクとはサブネットマスクは、IPアドレスを構成する32ビットの要素で、IPアドレスを
-
連結リストの交互ノードの積を求めるアルゴリズムとC言語での実装
n個のノードからなる連結リストが与えられたとき、交互(隔番目)のノードの値の積を出力するのが課題です。プログラムはノードの位置を実際に変更することなく、交互ノードの積だけを出力しなければなりません。例入力 -: 10 20 30 40 50 60 出力 -: 15000上記の例では、先頭ノードである10から数えて、交互ノードは「10、30、50」となります。その積は 10 × 30 × 50 = 15000 です。上図では、先頭ノードから数えた場合の交互ノードが青色で示されており、赤色のノードは計算対象外となります。アプローチnode型の一時ポインタ(例:temp)を用意します。このtempポ
-
単方向リンクリストの全ノードの積を求めるアルゴリズムとC言語実装
n個のノードで構成される単方向リンクリスト(片方向連結リスト)が与えられたとき、すべてのノードが保持する値の積を求めて出力するのがこの記事のテーマです。プログラムは先頭ノードからスタートし、リストの終端を示すNULLに到達するまで各ノードを順番にたどります。 例 入力 -: 1 2 3 4 5 出力 -: 120 上記の例では、先頭ノードから順に1、2、3、4、5のすべてのノードをたどり、それぞれの値を掛け合わせています。したがって積は 1×2×3×4×5 = 120 となります。 使用するアプローチ 以下の手順で全ノードの積を計算します。 node型の一時ポインタ(ここでは temp と
-
C言語で連結リストの末尾からn番目のノードを取得するプログラム
n個のノードからなる連結リストが与えられたとき、その末尾からn番目のノードを出力するのが本記事の目的です。プログラムはリスト内のノードの並び順を変更してはならず、あくまで末尾から数えてn番目に位置するノードの値を表示するだけでなければなりません。具体例入力 -: 10 20 30 40 50 60 N = 3 出力 -: 40上記の例では、先頭ノードから順に「count − n」個目までのノード(10, 20, 30, 40, 50, 60)を走査し、末尾から3番目のノードとして 40 が得られます。効率的なアプローチリスト全体を最後まで走査しなくても、以下の手順で目的のノードを見つけられ
-
C言語で作るEMI(月々返済額)計算機プログラムの実装方法
ローンを組む際、毎月いくら返済すればよいのかを把握することは非常に重要です。本記事では、元金・利率・期間の値が与えられたときに、毎月の返済額(EMI)を自動計算するプログラムをC言語で作成する方法を解説します。 EMIとは? EMIは「Equated Monthly Installment(均等月払い)」の略称で、ローンの元金と利息を含めた金額を毎月一定額で支払う返済方式のことです。この計算機を使えば、ユーザーは自分のローンにおける毎月の返済額を簡単に求めることができます。 実行例 入力: principal = 2000 rate = 5 time = 4 出力: Month
-
C言語で数の階乗を計算するプログラムの書き方を解説
階乗とはある数 n が与えられたとき、その数の階乗(factorial)を計算するのが本記事の目的です。階乗とは、その数から1までのすべての整数を掛け合わせた値のことを指します。階乗は次のように定義されます。0! = 1 1! = 1 2! = 2 × 1 = 2 3! = 3 × 2 × 1 = 6 4! = 4 × 3 × 2 × 1 = 24 5! = 5 × 4 × 3 × 2 × 1 = 120 . . . N! = n × (n-1) × (n-2) × … × 1なお、0の階乗は数学的な規約により 1 と定義されている点に注意してください。入力例と出力例入力1:n = 5 出力
-
【C++】対角線からひし形の面積と周囲長を計算するプログラムの作り方
ひし形とは? 幾何学において、ひし形(rhombus)とは、4つの辺がすべて同じ長さである四角形のことです。トランプのダイヤマークのような形をしており、「菱形」とも呼ばれます。なお、ひし形のすべての角が90度(直角)になると、それは正方形になります。 ひし形の主な性質は以下のとおりです。 4つの辺の長さがすべて等しい 向かい合う辺は平行で、向かい合う角も等しい(平行四辺形の性質を持つ) 2本の対角線は互いに直角に交わり、かつ互いを二等分する 以下はひし形の模式図です。 問題の概要 2本の対角線 d1 と d2 が与えられたとき、ひし形の「面積」と「周囲長」を求めます。面積とはその図形が
-
C言語で正三角形の内接円の面積と周囲長を計算する方法|正三角形の基礎知識
正三角形とは? 正三角形とは、名前の示すとおり3辺すべての長さが等しく、3つの内角もそれぞれ60度で等しい三角形のことです。正多角形の一種であるため、「正三角形」と呼ばれています。 正三角形の主な性質は以下のとおりです。 3つの辺の長さがすべて等しい 3つの内角がすべて60度で等しい 内接円とは? 内接円とは、三角形の内部に位置し、3つの辺すべてに接する円のことです。内接円の中心は三角形の中心と一致し、この中心点は「内心」、円の半径は「内接半径」と呼ばれます。 下の図は、正三角形の内接円を表したものです。 課題:内接円の面積と周囲長を求める ここでは、正三角形の一辺の長さが与えられたと
-
C言語でフィボナッチ数列を生成するプログラムの解説
整数 n が与えられたとき、0 から始めて n 項目までのフィボナッチ数列を生成するのが本記事の目的です。フィボナッチ数列は次のような形で表されます。 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 この数列では、最初の 2 つの値である 0 と 1 は固定されています。それ以降は、直前の 2 つの数字を足し合わせて新しい値を作っていきます。例えば以下のようになります。 0+1=1(3番目の値) 1+1=2(4番目の値) 2+1=3(5番目の値) …以降も同様に続きます フィボナッチ数列の一般項 F(n) は、次の漸化式として定義できます。 Fn = Fn-1 + Fn-2