给定正整数N,任务是找到第N个复合数。
例子:
Input: N = 1
Output: 4
Input: N = 3
Output: 8
方法:可以通过使用Eratosthenes筛网的概念来解决给定的问题。请按照以下步骤解决问题:
- 我sPrime []使用埃拉托色尼的筛标记的所有质数,直到10 5在布尔阵列发言权。
- 初始化一个数组,比如说composites [] ,该数组存储所有复合数字。
- 使用变量i遍历数组isPrime [] ,如果isPrime [i]的值为false,则在数组Composites []中插入数字i 。
- 完成上述步骤后,将值Composites [N – 1]打印为第N个Composite 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)