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

C++で奇数を素数の和として表現する方法|ゴールドバッハ予想を活用したアルゴリズム


この問題では、ある奇数Nが与えられます。求められているのは、その奇数を素数の和として表現することです。

ただし、表現に使用できる素数は最大で3つまでという制約があります。

問題を理解するための具体例

入力: N = 55

出力: 53 + 2

解法アプローチ

奇数は素数の和として表現できます。使用する素数の個数に着目すると、この問題は次の3つのケースに分けて考えることができます。

ケース1: n自体が素数である場合 → 1つの素数 n のみで表現できます。
ケース2: (n − 2) が素数である場合 → 2つの素数 2(n − 2) の和として表現できます。

ケース3: 上記のいずれにも当てはまらない場合 → まず3を引き、残りの (n − 3) は偶数になります。ここでゴールドバッハ予想の考え方を利用し、ある数Aが素数であり、かつ {(n − 3) − A} も素数であれば、その組み合わせを出力します。

ゴールドバッハ予想とは「4以上のすべての偶数は2つの素数の和として表現できる」という有名な予想で、この性質を利用すれば偶数を確実に2つの素数へ分解できます。

解法の動作を示すプログラム

サンプルコード

#include <iostream>
using namespace std;

bool isPrime(int x)
{
   if (x == 0 || x == 1)
      return false;
   for (int i = 2; i * i <= x; ++i)
      if (x % i == 0)
         return false;
   return true;
}

void primeAsSumofPrime(int n) {
   
   if (isPrime(n))
      cout<<n;
   else if (isPrime(n - 2))
      cout<<"2 "<<"+ "<<(n - 2);
   else{
      cout<<"3 "<<"+ ";
      n -= 3;
      for (int i = 0; i < n; i++) {
         if (isPrime(i) && isPrime(n - i)) {
            cout<<i<<" + "<<(n - i);
            break;
         }
      }
   }
}

int main() {
   
   int n = 561;
   cout<<"The number "<<n<<" expressed as sum of primes is ";
   primeAsSumofPrime(n);
   return 0;
}

出力:

The number 561 expressed as sum of primes is 3 + 11 + 547
  1. C++でデューデニー数(Dudeney Number)を判定する方法

    デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ

  2. C++で数値が2つの三角数の和として表現できるか判定する方法

    本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ