给定正整数N ,任务是找到最小的半素数,以使其两个除数之间的差至少为N。
例子:
Input: N = 2
Output: 15
Explanation:
The divisors of 15 are 1, 3, 5, and 15 and the difference between any of its two divisors is greater than or equal to N(= 2).
Input: N = 3
Output: 55
方法:可以通过找到两个差异至少为N的素数(例如X和Y )来解决给定的问题。这个想法是找到第一个质数,即X大于N ,第二个质数,即Y大于(N + X) 。请按照以下步骤解决问题:
- 初始化一个布尔数组prime [],以使用Eratosthenes的Sieve最多存储10 5个素数,这样,如果i为质数,则prime [i]将为true 。否则,为false 。
- 初始化两个变量,例如X和Y ,它们存储两个素数,以使X和Y的乘积成为所得的半素数。
- 使用变量i从(N + 1)迭代一个循环,如果prime [i]的值为true ,则将X的值更新为i并退出循环。
- 使用变量i从(N + X)迭代一个循环,如果prime [i]的值为true ,则将Y的值更新为i并退出循环。
- 完成上述步骤后,将X和Y的乘积打印为所得的半质数。
下面是上述方法的实现:
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)