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

C++でN番目のスマート数(Smart Number)を求める方法

「スマート数(Smart Number)」とは、3つ以上の異なる素因数を持つ整数のことです。この記事では、与えられた数 N に対して、N 番目のスマート数を求めるアルゴリズムとその C++ 実装を解説します。

スマート数の列は以下のように始まります。

30, 42, 60, 66, 70, 78...

例えば、最初のスマート数である 30 は、素因数として 2・3・5 の3つの異なる素数を持っているため、スマート数と判定されます。

アルゴリズム

  • 求めたい番号 N を初期化します。
  • カウント用の変数 count を 0 で初期化します。
  • ある数が素数かどうかを判定する関数を作成します。
  • ある数がスマート数かどうかを判定する関数を作成します。
  • 最初のスマート数が 30 であるため、30 から順にループ処理を行います。
    • 素数判定関数を使って、現在の数がスマート数かどうかを確認します。
    • スマート数が見つかるたびに count を 1 ずつ増やします。
    • count が N と等しくなった時点で、その数を返します。

C++での実装

以下は、上記のアルゴリズムを C++ で実装したコードです。

#include<bits/stdc++.h>
using namespace std;
bool isPrime(int n) {
   if (n < 2) return false;
   for (int i = 2; i <= sqrt(n); i++) {
      if (n % i == 0) return false;
   }
   return true;
}
bool isSmartNumber(int n) {
   int count = 0;
   for (int i = 2; i < n; i++) {
      if (n % i == 0 && isPrime(i)) {
         count += 1;
      }
      if (count == 3) {
         return true;
      }
   }
return false;
}
int getNthSmartNumber(int n) {
   int i = 30, count = 0;
   while (true) {
      if (isSmartNumber(i)) {
         count += 1;
      }
      if (count == n) {
         return i;
      }
      i += 1;
   }
}
int main() {
   int N = 25;
   cout << getNthSmartNumber(N) << endl;
   return 0;
}

実行結果

上記のコードを実行すると、次の出力が得られます。これは 25 番目のスマート数に相当します。

174

このように、素数判定と約数の探索を組み合わせることで、効率的に N 番目のスマート数を求めることができます。計算量をさらに抑えたい場合は、素因数分解を高速化する手法(試し割り法の範囲を √n までに限定するなど)を活用するとよいでしょう。

  1. C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】

    この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具

  2. C++で五胞体数(ペンタトープ数)を求める方法

    五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の