📜  查找第N个复合数字的程序

📅  最后修改于: 2021-05-07 10:17:30             🧑  作者: Mango

给定正整数N,任务是找到第N复合数。

例子:

方法:可以通过使用Eratosthenes筛网的概念来解决给定的问题。请按照以下步骤解决问题:

  • sPrime []使用埃拉托色尼的筛标记的所有质数,直到10 5在布尔阵列发言权。
  • 初始化一个数组,比如说composites [] ,该数组存储所有复合数字。
  • 使用变量i遍历数组isPrime [] ,如果isPrime [i]的值为false,则在数组Composites []中插入数字i
  • 完成上述步骤后,将值Composites [N – 1]打印为第NComposite Number。

下面是上述方法的实现:

C++
// C++ program for the above approach
  
#include 
using namespace std;
  
#define MAX_SIZE 1000005
  
// Function to find the Nth Composite
// Numbers using Sieve of Eratosthenes
int NthComposite(int N)
{
    // Seive of prime numbers
    bool IsPrime[MAX_SIZE];
  
    // Initialize the array to true
    memset(IsPrime, true, sizeof(IsPrime));
  
    // Iterate over the range [2, MAX_SIZE]
    for (int p = 2;
         p * p < MAX_SIZE; p++) {
  
        // If IsPrime[p] is true
        if (IsPrime[p] == true) {
  
            // Iterate over the
            // range [p * p, MAX_SIZE]
            for (int i = p * p;
                 i < MAX_SIZE; i += p)
                IsPrime[i] = false;
        }
    }
  
    // Stores the list of composite numbers
    vector Composites;
  
    // Iterate over the range [4, MAX_SIZE]
    for (int p = 4; p < MAX_SIZE; p++)
  
        // If i is not prime
        if (!IsPrime[p])
            Composites.push_back(p);
  
    // Return Nth Composite Number
    return Composites[N - 1];
}
  
// Driver Code
int main()
{
    int N = 4;
    cout << NthComposite(N);
    return 0;
}


输出:
9

时间复杂度: O(N + M * log(log(M)),其中[2,M]是执行Eratosthenes筛分的范围。
辅助空间: O(N)