Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

配列内の素数と非素数の合計の絶対差を求める方法

はじめに

本記事では、配列内のすべての素数の合計と、すべての非素数(合成数)の合計の差を求め、その絶対値を計算する方法を解説します。

この問題を解くためには、まず各数値が素数かどうかを判定する必要があります。素数判定の基本的なアプローチとしては、「対象の数が 2 からその平方根までのいずれの整数でも割り切れないこと」を確認する方法があります。この方法では、1つの数値の判定に O(√n) の時間計算量が必要です。

アルゴリズム

diffPrimeNonPrimeSum(arr)

begin
    sum_p := arr 内のすべての素数の合計
    sum_np := arr 内のすべての非素数の合計
    return |sum_p − sum_np|
end

C++ による実装例

#include <iostream>
#include <cmath>
using namespace std;

bool isPrime(int n) {
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            return false; // 素数ではない
        }
    }
    return true; // 素数である
}

int diffPrimeNonPrimeSum(int arr[], int n) {
    int sum_p = 0, sum_np = 0;
    for (int i = 0; i < n; i++) {
        if (isPrime(arr[i])) {
            sum_p += arr[i];   // 素数の合計に加算
        } else {
            sum_np += arr[i];  // 非素数の合計に加算
        }
    }
    return abs(sum_p - sum_np);
}

int main() {
    int arr[] = { 5, 8, 9, 6, 21, 27, 3, 13 };
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << "Difference: " << diffPrimeNonPrimeSum(arr, n);
}

出力

Difference: 50

計算過程の確認

サンプル配列 {5, 8, 9, 6, 21, 27, 3, 13} の場合、処理は以下のように進みます。

  • 素数:5, 3, 13 → 合計 = 21
  • 非素数:8, 9, 6, 21, 27 → 合計 = 71
  • 絶対差:|21 − 71| = 50

なお、isPrime() 関数は 2 から √n までの範囲のみをチェックするため、全要素に対して効率的に素数判定を行うことができます。配列全体の計算量は O(n√m)(m は配列内の最大値)となります。

  1. 【Java】配列内の最大素数と最小素数の差を求める方法|エラトステネスの篩で効率的に解く

    問題の概要100万未満の整数要素で構成される配列が与えられたとき、配列内に存在する最大の素数と最小の素数の差を求めます。実行例たとえば、次のような配列を考えてみましょう。配列: [1, 2, 3, 4, 5]最大の素数 = 5最小の素数 = 2差 = 5 - 2 = 3解決アプローチ:エラトステネスの篩この問題を効率的に解くには、エラトステネスの篩(Sieve of Eratosthenes)という古典的なアルゴリズムを使用します。これは、ある数値以下のすべての素数を高速に列挙できる手法として知られています。具体的な手順は以下の通りです。あらかじめ100万以下のすべての素数をエラトステネスの篩

  2. 最初のn個の自然数における「二乗和」と「和の二乗」の差を求めるJavaプログラム

    プログラミングの学習でよく登場する古典的な数学的問題の一つに、「最初のn個の自然数について、各数値の二乗の合計(二乗和)と、合計値を二乗した値(和の二乗)の差を求める」というものがあります。この記事では、問題の内容をわかりやすく解説し、Javaによる実装例を紹介します。 問題の概要 ある整数 n が与えられたとき、以下の2つの値の差を計算するプログラムを作成します。 最初の n 個の自然数それぞれを二乗し、それらを合計した値(二乗和) 最初の n 個の自然数を合計し、その結果を二乗した値(和の二乗) 具体例で確認する n = 3 の場合を例に、手順を順番に見ていきましょう。 n = 3 の