Javaで数値が2つの素数の和として表現できるかどうかを判定するプログラム
本記事では、ある数値が2つの素数の和として表現できるかどうかを判定するJavaプログラムについて解説します。
素数とは
素数とは、約数が「1」と「その数自身」の2つしかない特別な自然数のことです。言い換えれば、1とその数以外では割り切れない数です。例えば、11は素数であり、その約数は1と11だけです。素数の例としては、2、3、5、7、11、13などが挙げられます。
なお、2は唯一の偶数の素数であり、それ以外の素数はすべて奇数になります。
処理内容の確認
以下に具体的な入力と出力の例を示します。
入力:
入力する数値 : 43
出力:
この数値は2つの素数の和として表現できます。 考えられる組み合わせ : 43 = 2 + 41
アルゴリズム
このプログラムの処理手順は以下の通りです。
ステップ1 - 開始 ステップ2 - 整数型変数 my_input と i を宣言する ステップ3 - ユーザーから値を読み込む、または値を定義する ステップ4 - 整数を受け取り、その値が素数かどうかを判定する関数 IsPrime を定義する ステップ5 - forループを使って2から my_input の半分まで繰り返し、「i」と「my_input - i」がどちらも素数であるかをチェックする。両方とも素数であれば、その値のペアを保存する ステップ6 - 結果を表示する ステップ7 - 終了
例1:ユーザーからの入力を使用する場合
この例では、Scannerクラスを使ってユーザーから数値を入力として受け取ります。オンラインコンパイラなどでも実際に動作を試すことができます。
import java.util.Scanner;
public class SumOfPrimes {
public static void main(String[] args) {
int my_input, i;
boolean my_temp = false;
my_input = 43;
System.out.println("必要なパッケージがインポートされました");
Scanner my_scanner = new Scanner(System.in);
System.out.println("リーダーオブジェクトが定義されました ");
System.out.print("数値を入力してください : ");
my_input = my_scanner.nextInt();
for (i = 2; i <= my_input / 2; ++i) {
if (IsPrime(i)) {
if (IsPrime(my_input - i)) {
System.out.println("この数値は2つの素数の和として表現できます。");
System.out.println("考えられる組み合わせ :");
System.out.printf("%d = %d + %d\n", my_input, i, my_input - i);
my_temp = true;
}
}
}
if (!my_temp)
System.out.println(my_input + " は2つの素数の和として表現できません。");
}
static boolean IsPrime(int num) {
boolean my_prime = true;
for (int i = 2; i <= num / 2; ++i) {
if (num % i == 0) {
my_prime = false;
break;
}
}
return my_prime;
}
}実行結果
必要なパッケージがインポートされました リーダーオブジェクトが定義されました 数値を入力してください : 43 この数値は2つの素数の和として表現できます。 考えられるすべての組み合わせ : 43 = 2 + 41
例2:事前に定義した値を使用する場合
この例では、整数値があらかじめコード内で定義されており、その値を取得してコンソールに表示します。入力処理がないため、単純にロジックの動作を確認したい場合に便利です。
public class SumOfPrimes {
public static void main(String[] args) {
int my_input, i;
boolean my_temp = false;
my_input = 43;
System.out.println("対象の数値は " +my_input+ " に設定されています");
for (i = 2; i <= my_input / 2; ++i) {
if (IsPrime(i)) {
if (IsPrime(my_input - i)) {
System.out.println("この数値は2つの素数の和として表現できます。");
System.out.println("考えられる組み合わせ :");
System.out.printf("%d = %d + %d\n", my_input, i, my_input - i);
my_temp = true;
}
}
}
if (!my_temp)
System.out.println(my_input + " は2つの素数の和として表現できません。");
}
static boolean IsPrime(int num) {
boolean my_prime = true;
for (int i = 2; i <= num / 2; ++i) {
if (num % i == 0) {
my_prime = false;
break;
}
}
return my_prime;
}
}実行結果
対象の数値は 43 に設定されています この数値は2つの素数の和として表現できます。 考えられるすべての組み合わせ : 43 = 2 + 41
まとめ
このように、2から対象の数値の半分まで順番に素数のペアを調べることで、数値が2つの素数の和として表現できるかどうかを効率的に判定できます。素数判定には、2からその数の半分まで順に割り切れるかを確認するシンプルな方法を使用しています。より大きな数値を扱う場合は、平方根まで調べる方法やエラトステネスの篩などを活用すると、さらに高速化できます。
-
C++で数値が2つの過剰数の和として表現できるか判定する方法
ある整数 n が与えられたとき、それを2つの過剰数の和として表現できるかどうかを判定します。表現できる場合はその2つの数を出力し、できない場合は -1 を出力します。 ここで「過剰数(Abundant Number)」とは、その数自身を除く約数(真の約数)の総和 sum(n) が、元の数の値より大きくなるような数のことです。例えば 12 の真の約数は 1, 2, 3, 4, 6 で、その総和は 16 となり 12 より大きいため、12 は過剰数です。 解法のアプローチ この問題を解くには、まず N 未満のすべての過剰数をあらかじめセット(set)に格納しておきます。次に、与えられた数 n に
-
C++で数値が2つの三角数の和として表現できるか判定する方法
本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ