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 ずつ減らしながら繰り返します。
- 内側のループ: j を i/2 から 1 まで 1 ずつ減らしながら繰り返します。
- i % j == 0 かつ j != 1 の場合、i は素数ではないため flag = 0 としてループを抜けます。
- それ以外の場合は flag = 1 を設定します。
- 内側のループ: j を i/2 から 1 まで 1 ずつ減らしながら繰り返します。
- 判定と出力: 内側のループ終了後、flag == 1 であれば i は素数なので出力します。
- 終了: 外側のループが完了したら処理を終了します。
サンプルコード
#include <stdio.h>
int main(int argc, char const *argv[]) {
int n, i, j, flag=0;
printf("Enter a number\n");
scanf("%d", &n);
for(i=n; i>1; i--) {
for (j = i/2; j >= 1; j--) {
if(i%j==0 && j!=1) {
flag = 0;
break;
}
else
flag = 1;
}
if(flag == 1) {
printf("%d ", i);
}
}
return 0;
}実行結果
上記のプログラムをコンパイルして実行すると、次のような出力が得られます。
Enter a number 30 29 23 19 17 13 11 7 5 3 2
プログラムのポイント
- 降順での走査: 外側のループが n から 2 に向かって減少していくため、結果は自然と大きい順に出力されます。
- 約数チェックの範囲: 素数判定では、i の半分(i/2)まで調べれば十分です。それより大きい約数は存在しないため、無駄な計算を省けます。
- flag 変数の役割: 約数が見つかった時点で flag を 0 にして break することで、以降の無駄な判定を回避しています。
-
C言語の再帰を使って連結リストの末尾からk個のノードを表示する方法
本記事では、再帰(リカーシブ)アプローチを用いて、連結リスト(リンクリスト)の末尾からk個のノードを表示する方法を解説します。 再帰的アプローチとは、関数が終了条件を満たすまで自分自身を繰り返し呼び出し、その過程で結果を保持していく手法のことです。連結リストは前方へのポインタしか持たないため、末尾側から処理を行いたい場合には再帰が特に有効です。 例えば、リストが 29、34、43、56、88 というノードを持っており、k の値が 2 である場合、出力は末尾から 2 個のノード、つまり「88」と「56」になります。 実行例 連結リスト: 29->34->43->56->
-
指定した範囲内のすべての素数を出力するPythonプログラム
この記事では、以下の問題文に対する解決方法について学んでいきます。 問題文 ある区間が与えられたとき、その範囲内に含まれるすべての素数を求めて出力する必要があります。 ここでは、素数の基本的な定義に基づいた全探索(ブルートフォース)によるアプローチを紹介します。素数とは、「1とその数自身のみを約数として持ち、それ以外の数を約数に持たない自然数」のことです。 この定義に基づき、各数値が素数の条件を満たしているかどうかを判定し、条件が真(True)と評価されるたびに出力処理を行います。 それでは、実際の実装例を見ていきましょう。 実装例 start = 1 end = 37 for val in