-
C言語:奇数桁と偶数桁の合計の差が0かどうかを判定するプログラム
長い整数が1つ与えられたとき、奇数番目の位置にある桁の合計と偶数番目の位置にある桁の合計の差が0になるかどうかを判定する問題を考えます。ここでいう位置とは、最も左の桁を0番目として数えたものです。例として、156486という数を見てみましょう。奇数番目の位置の桁の合計は (5 + 4 + 6) = 15、偶数番目の位置の桁の合計は (1 + 6 + 8) = 15 となり、両者は一致します。この問題には2つの解き方があります。1つ目は、数の先頭から末尾まで順に走査し、位置を交互に切り替えながらそれぞれの合計を求めて差を計算する方法です。2つ目はよりシンプルで効率的な方法で、数学的な性質を利用し
-
C言語で指定された数のすべての素因数を効率的に求めるプログラム
この記事では、ある整数のすべての素因数を効率的に求めて出力する方法を解説します。例として、n = 1092 という数を考えてみましょう。1092 の素因数は 2、2、3、7、13 です。この問題を効率よく解くためには、以下の手順に従います。数が 2 で割り切れる間、「2」を出力し続け、そのたびに数を 2 で割っていきます。この処理が終わった時点で、残りの数は必ず奇数になります。そこで、3 からその数の平方根までの範囲で、現在の値(奇数のみ)で割り切れるかどうかを確認します。割り切れる場合は出力し、数をその値で割って処理を繰り返します。より理解しやすいように、アルゴリズムを見てみましょう。アルゴ
-
C言語で学ぶ拡張ユークリッドの互除法:GCDとベズー係数の求め方
この記事では、C言語による拡張ユークリッドの互除法(Extended Euclidean Algorithm)の実装方法を解説します。拡張ユークリッドの互除法は、通常のユークリッドの互除法と同じように最大公約数(GCD)を求められるだけでなく、次の等式を満たす整数係数 x と y も同時に求められる点が大きな特徴です。𝑎𝑥 + 𝑏𝑦 = gcd(𝑎, 𝑏)このような形の等式は「ベズーの等式」と呼ばれ、係数 x と y は「ベズー係数」とも呼ばれます。このアルゴリズムでは、gcd(a, b) の値を gcd(b mod a, a) という再帰呼び出しによって順に更新しながら計算を進め
-
C言語で数の最大の素因数を求めるプログラムの作成方法
この記事では、ある整数の最大の素因数を効率的に求める方法を解説します。例として n = 1092 を考えてみましょう。1092 を素因数分解すると 2 × 2 × 3 × 7 × 13 となるため、最大の素因数は 13 です。この問題を解くには、以下の手順に従います。数が 2 で割り切れる間、最大値として 2 を記録し、数を 2 で繰り返し割ります。この時点で数は必ず奇数になっています。そこで 3 から数の平方根までの範囲を調べ、現在の値 i で割り切れる場合は i を最大の素因数として記録し、数を i で割りながら処理を続けます。最後に、残った数が 2 より大きい場合(1 ではない場合)、そ
-
【C言語】ある整数の奇数の素因数の合計を効率的に求める方法
この記事では、ある整数の奇数の素因数の合計を効率的に求めるCプログラムについて解説します。例として n = 1092 を考えてみましょう。1092 を素因数分解すると 2 × 2 × 3 × 7 × 13 となります。ここから偶数の素因数(2)を取り除いた奇数の素因数は 3, 7, 13 なので、その合計は 3 + 7 + 13 = 23 になります。この問題を解くには、以下の手順に従います。数が 2 で割り切れる間は、その因数を無視して、数を繰り返し 2 で割ります。この時点で数は必ず奇数になっています。次に、3 から数の平方根までの範囲で現在の値(奇数のみ)による割り算を試し、割り切れた場
-
合計が完全平方数になるn個の数を出力する方法【C言語】
問題概要本記事では、指定された個数(n)の整数を出力し、それらの合計が完全平方数(ある整数の2乗として表せる数)となるようにするプログラムを紹介します。ここで重要なのが、次の数学的性質です。「最初から数えてn個の奇数を足すと、必ず n²(nの2乗)になる」この性質を利用すれば、複雑な計算を行わなくても簡単に目的の数列を求めることができます。入力例 : 5 出力例 : 1 3 5 7 9 検算 : 1 + 3 + 5 + 7 + 9 = 25 = 5²(完全平方数)アルゴリズム処理の流れは以下の通りです。サイズ(SIZE)を5、カウンタ変数 i を1として宣言・初期化します。i が SIZE
-
【C言語】文字列内の単語数・母音数・指定文字の出現頻度を一度に数える方法
文字列を入力し、その中に含まれる単語の総数、母音の数、そしてユーザーが指定した特定文字の出現頻度を一度に求めるC言語プログラムを紹介します。例えば、文字列「I love my MOM」と文字「M」を入力すると、以下のような結果が得られます。入力:文字列を入力してください : I love my MOM 頻度を調べたい文字を入力してください : M M の出現頻度の合計 : 2 母音の総数 : 4 単語の総数 : 4アルゴリズム開始 ステップ1: 文字列配列 str、文字 ch、カウンタ i を宣言し、freq・vow・word を 0 で初期化する ステップ2: 文字列と文字 ch を入力する
-
C言語で3つの文字列を指定文字に置換し、連結して出力する方法
3つの文字列を入力し、それぞれの文字列をユーザーが指定した1文字で置き換えます。置き換え後の各文字列を表示した後、3つの文字列を連結した結果を出力します。 入力: 文字列1 : tutorials 文字列1の置換文字 : x 文字列2 : points 文字列2の置換文字 : y 文字列3 : best 文字列3の置換文字 : z 出力 : 文字
-
0〜99の範囲内で欠けている要素を見つけて出力する方法
このプログラムでは、ユーザーが入力した配列の中から、0〜99の範囲に存在しない値(欠落している要素)を検出して出力します。単一の欠落数値だけでなく、連続する欠落範囲(レンジ)も「開始値-終了値」の形式で表示できるのが特徴です。入力例 : array = {88, 105, 3, 2, 200, 0, 10}; 出力例 : 1 4-9 11-87 89-99上記の例では、配列に含まれる 0〜99 の範囲の値は {88, 3, 2, 0, 10} だけです。105 と 200 は範囲外のため無視されます。その結果、存在しない 1、4〜9、11〜87、89〜99 が出力されます。アルゴリズムSTAR
-
2つのソート済み配列から共通しない要素を出力するC言語プログラム
2つのソート済み配列が与えられたとき、両方の配列に共通して含まれる要素を取り除き、どちらか一方にのみ存在する要素(共通しない要素)だけを出力する方法を解説します。配列がすでにソートされていることを利用すると、追加のメモリを使わずに線形時間で効率よく処理できます。 入力例 : array1[]= {1, 4, 6, 9, 12} array2[]= {2, 4, 7, 8, 9, 10} 出力例 : 1 2 6 7 8 10 12 アルゴリズム 基本的な考え方は、マージソートのマージ処理と同じです。両方の配列を先頭から順番に比較し、値が小さいほうの要素を出力してインデックスを進
-
級数の最初のN項(0.25、0.5、0.75…)を分数形式で出力するCプログラム
本記事では、級数(0、¼、½、¾、1 …)の最初の N 項を分数形式で出力する C プログラムを紹介します。級数を出力する範囲を示す項数 N を入力すると、各項が約分された形で順番に表示されます。 入力:N = 5 出力:0 ¼ ½ ¾ 1 プログラムの考え方 この級数は一般に「i / 4」(i = 0, 1, 2, …)という形で表せます。各項を最もシンプルな形で表示するために、分子 i の性質に応じて次のように分類します。 i が 4 の倍数の場合:完全に約分できるため、整数として表示(例:0、1) i が 2 の倍数の場合:分母 2 に約分して表示(例:1/2) i が奇数の場合:分母
-
1からNまでの素数を逆順に出力するC言語プログラム
本記事では、入力された数値 n までに存在する素数をすべて求め、大きい順(逆順)で表示するC言語プログラムを紹介します。例えば、30 を入力した場合、30 以下の素数である 29・23・19・17・13・11・7・5・3・2 が降順に出力されます。Input : number 30 Output : 29 23 19 17 13 11 7 5 3 2アルゴリズム処理の流れは以下の通りです。変数の宣言: int 型の変数 n、i、j、flag を宣言し、flag は 0 で初期化します。入力: 数値を読み込み、n に格納します。外側のループ: i を n から 2 まで 1 ずつ減らしながら繰り
-
【C言語】配列の要素を出現回数つきで降順に表示する方法
int型の要素を持つ配列が与えられたとき、各要素を降順に並べて表示し、同時にそれぞれの出現回数(頻度)を求めるのがこの記事の目的です。ここでは、あらかじめ昇順にソートされた配列を後ろから走査することで、効率よく値ごとの出現回数をカウントしていく手法を紹介します。入力と出力の例入力 : arr[]={1,1,1,2,2,2,3,3,4,5,6,7,7} 出力 : 7 occurs: 2 6 occurs: 1 5 occurs: 1 4 occurs: 1 &nbs
-
C++で行列を反スパイラル形式(逆渦巻き順)に出力する方法
はじめにn×n の2次元配列が与えられたとき、その行列を「反スパイラル形式」で出力することが本記事の課題です。反スパイラル出力とは、通常のスパイラル(渦巻き)順とは逆の順序で要素を取り出すことを指します。例として、以下の4×4の行列を考えてみましょう。Input : arr[4][4]={1,2,3,4, 5,6,7,8, 9,10,11,12 13,14,15,16} Output: 10 11 7 6 5 9 13 14 15 16 12 8 4
-
n×n行列を対角線パターンで出力する方法【C++実装例つき】
問題の概要 n×n の2次元配列が与えられたとき、その行列から主対角線(左上→右下)と反対角線(右上→左下)の要素を取り出して出力することが課題です。 例えば、以下のような4×4の行列を考えてみましょう。 入力 : arr[4][4]={1,2,3,4, 5,6,7,8, 9,10,11,12 13,14,15,16} 出力 : 1 6 11 16 4 7 10 13 「1 6 11 16」は主対角線上の要素、「4 7 10 13」は反対角線上の要
-
配列から「1・2・3」をすべて含む数値を昇順で出力する方法【C++】
この記事では、配列内の数値のうち、各桁に「1」「2」「3」をすべて含む数値だけを抽出し、昍順に出力する方法を解説します。該当する数値がひとつも存在しない場合は、-1 を出力します。入力 : arr[] = {320,123,124,125,14532,126,340,123400,100032,13,32,3123,1100} 出力 : 123 3123 14532 100032 123400この配列には「1」「2」「3」をすべて含む数値が複数存在するため、-1 は返されず、これらの3つの数字をすべて含む 5 つの値が出力されます。アルゴリズム処理の手順は以下のとおりです。開始 ステップ1 →
-
【C++】配列内の「各桁の合計が素数」になる数を出力する方法
整数型の配列が与えられたとき、その要素の中から「各桁の数字を足し合わせた合計値(桁和)が素数になっている数」だけを取り出して出力するのが本記事の目的です。該当する数が一つも存在しない場合は -1 を返します。入力と出力の例Input: arr[]={2,4,3,19,25,6,11,12,18,7} Output : 2, 3, 25, 11, 12, 7この出力結果について詳しく見てみましょう。2、3、7 はそれ自体が素数であり、桁和も元の数と同じため条件を満たします。また、25(2+5=7)、11(1+1=2)、12(1+2=3)は、それぞれの桁を足した結果がいずれも素数となるため出力対象
-
最初と最後のビットだけが1になっている数を出力するCプログラム
この記事では、与えられた数 n 以下の整数の中から、2進表現において最初と最後のビットだけが1(セットビット)になっている数をすべて出力する方法を解説します。 コンピュータの用語では、値が「1」のビットをセットビット、値が「0」のビットをアンセットビットと呼びます。 入力と出力の例 入力:num = 5 出力:1 3 5 1 は 2進数で「1」 3 は 2進数で「11」 5 は 2進数で「101」 出力される数は「1」「11」「101」のように、先頭と末尾のビット以外がすべて0になっているのが特徴です。 アルゴリズム START ステップ1:unsigned int
-
中順走査(Inorder)と前順走査(Preorder)から後順走査(Postorder)を出力するCプログラム
二分木の中順走査(inorder traversal)と前順走査(preorder traversal)が与えられたとき、それらをもとに後順走査(postorder traversal)を求めて出力するプログラムを作成します。入力と出力の例入力: Inorder traversal in[] = {4, 2, 5, 1, 3, 6} Preorder traversal pre[] = {1, 2, 4, 5, 3, 6} 出力: Postorder traversal post[] = {4, 5, 2, 6, 3, 1}アルゴリズムの考え方この問題を解く鍵となるのは、各走査の次のような性
-
スタックデータ構造を使って連結リストを逆順に出力する方法【C言語】
連結リスト(リンクリスト)が与えられたとき、スタックというデータ構造を活用して、リストの要素を末尾から先頭へ向かって出力するプログラムを作成します。入力 : 10 -> 5 -> 3 -> 1 -> 7 -> 9 出力: 9 -> 7 -> 1 -> 3 -> 5 -> 10この問題では、スタックから要素をポップ(取り出し)していくアプローチを採用します。具体的には、top を stack[0] の位置から始め、stack[n] の要素まで順番に処理を進めていきます。アルゴリズムSTART Step 1 -> 構造体 Linke