📜  最小半素数,两个除数之间至少相差N

📅  最后修改于: 2021-04-18 02:36:01             🧑  作者: Mango

给定正整数N ,任务是找到最小的半素数,以使其两个除数之间的差至少为N。

例子:

方法:可以通过找到两个差异至少为N的素数(例如XY )来解决给定的问题。这个想法是找到第一个质数,即X大于N ,第二个质数,即Y大于(N + X) 。请按照以下步骤解决问题:

  • 初始化一个布尔数组prime [],以使用Eratosthenes的Sieve最多存储10 5个素数,这样,如果i为质数,则prime [i]将为true 。否则,为false
  • 初始化两个变量,例如XY ,它们存储两个素数,以使XY的乘积成为所得的半素数。
  • 使用变量i从(N + 1)迭代一个循环,如果prime [i]的值为true ,则将X的值更新为i并退出循环。
  • 使用变量i从(N + X)迭代一个循环,如果prime [i]的值为true ,则将Y的值更新为i并退出循环。
  • 完成上述步骤后,将XY的乘积打印为所得的半质数。

下面是上述方法的实现:

C++
// C++ program for the above approach
  
#include 
#define MAX 100001
using namespace std;
  
// Function to find all the prime
// numbers using Sieve of Eratosthenes
void SieveOfEratosthenes(bool prime[])
{
    // Set 0 and 1 as non-prime
    prime[0] = false;
    prime[1] = false;
  
    for (int p = 2; p * p < MAX; p++) {
  
        // If p is a prime
        if (prime[p] == true) {
  
            // Set all multiples
            // of p as non-prime
            for (int i = p * p; i < MAX; i += p)
                prime[i] = false;
        }
    }
}
  
// Function to find the smallest semi-prime
// number having a difference between any
// of its two divisors at least N
void smallestSemiPrime(int n)
{
    // Stores the prime numbers
    bool prime[MAX];
    memset(prime, true, sizeof(prime));
  
    // Fill the prime array
    SieveOfEratosthenes(prime);
  
    // Initialize the first divisor
    int num1 = n + 1;
  
    // Find the value of the first
    // prime number
    while (prime[num1] != true) {
        num1++;
    }
  
    // Initialize the second divisor
    int num2 = num1 + n;
  
    // Find the second prime number
    while (prime[num2] != true) {
        num2++;
    }
  
    // Print the semi-prime number
    cout << num1 * 1LL * num2;
}
  
// Driver Code
int main()
{
    int N = 2;
    smallestSemiPrime(N);
  
    return 0;
}


输出:
15

时间复杂度: O(M * log(log(M))),其中M是prime []数组的大小
辅助空间: O(M)