📜  原始数

📅  最后修改于: 2021-05-04 20:40:54             🧑  作者: Mango

给定数字n,任务是计算其原始数。原始数(表示为P n #)是前n个素数的乘积。数字的本数与数字的阶乘相似。在原始数中,并非所有自然数都被相乘,只有素数被相乘才能计算数字的原始数。用P#表示。

例子:

Input: n = 3
Output: 30 
Priomorial = 2 * 3 * 5 = 30
As a side note, factorial is 2 * 3 * 4 * 5

Input: n = 5
Output: 2310
Primorial = 2 * 3 * 5 * 7 * 11 

一个幼稚的方法是逐个检查从1到n的所有数字是否为质数,如果是,则将乘法结果存储在n中,类似地将质数乘法的结果存储为n。

一种有效的方法是使用Sundaram的Sieve查找所有素数至n的n,然后通过将它们全部相乘来计算本数。

C++
// C++ program to find Primorial of given numbers
#include
using namespace std;
const int MAX = 1000000;
  
// vector to store all prime less than and equal to 10^6
vector  primes;
  
// Function for sieve of sundaram. This function stores all
// prime numbers less than MAX in primes
void sieveSundaram()
{
    // In general Sieve of Sundaram, produces primes smaller
    // than (2*x + 2) for a number given number x. Since
    // we want primes smaller than MAX, we reduce MAX to half
    // This array is used to separate numbers of the form
    // i+j+2ij from others where 1 <= i <= j
    bool marked[MAX/2 + 1] = {0};
  
    // Main logic of Sundaram. Mark all numbers which
    // do not generate prime number by doing 2*i+1
    for (int i = 1; i <= (sqrt(MAX)-1)/2 ; i++)
        for (int j = (i*(i+1))<<1 ; j <= MAX/2 ; j += 2*i +1)
            marked[j] = true;
  
    // Since 2 is a prime number
    primes.push_back(2);
  
    // Print other primes. Remaining primes are of the
    // form 2*i + 1 such that marked[i] is false.
    for (int i=1; i<=MAX/2; i++)
        if (marked[i] == false)
            primes.push_back(2*i + 1);
}
  
// Function to calculate primorial of n
int calculatePrimorial(int n)
{
    // Multiply first n primes 
    int result = 1;  
    for (int i=0; i


Java
// Java program to find Primorial of given numbers 
import java.util.*;
  
class GFG{
  
public static int MAX = 1000000;
  
// vector to store all prime less than and equal to 10^6 
static ArrayList primes = new ArrayList();
  
// Function for sieve of sundaram. This function stores all 
// prime numbers less than MAX in primes 
static void sieveSundaram()
{
    // In general Sieve of Sundaram, produces primes smaller 
    // than (2*x + 2) for a number given number x. Since 
    // we want primes smaller than MAX, we reduce MAX to half 
    // This array is used to separate numbers of the form 
    // i+j+2ij from others where 1 <= i <= j 
    boolean[] marked = new boolean[MAX];
  
    // Main logic of Sundaram. Mark all numbers which 
    // do not generate prime number by doing 2*i+1 
    for (int i = 1; i <= (Math.sqrt(MAX) - 1) / 2 ; i++)
    {
        for (int j = (i * (i + 1)) << 1 ; j <= MAX / 2 ; j += 2 * i + 1)
        {
            marked[j] = true;
        }
    }
  
    // Since 2 is a prime number 
    primes.add(2);
  
    // Print other primes. Remaining primes are of the 
    // form 2*i + 1 such that marked[i] is false. 
    for (int i = 1; i <= MAX / 2; i++)
    {
        if (marked[i] == false)
        {
            primes.add(2 * i + 1);
        }
    }
}
  
// Function to calculate primorial of n 
static int calculatePrimorial(int n)
{
    // Multiply first n primes 
    int result = 1;
    for (int i = 0; i < n; i++)
    {
    result = result * primes.get(i);
    }
    return result;
}
  
// Driver code 
public static void main(String[] args)
{
    int n = 5;
    sieveSundaram();
    for (int i = 1 ; i <= n; i++)
    {
        System.out.println("Primorial(P#) of "+i+" is "+calculatePrimorial(i));
    }
}
}
// This Code is contributed by mits


Python3
# Python3 program to find Primorial of given numbers 
import math
MAX = 1000000; 
  
# vector to store all prime less than and equal to 10^6 
primes=[]; 
  
# Function for sieve of sundaram. This function stores all 
# prime numbers less than MAX in primes 
def sieveSundaram():
   
    # In general Sieve of Sundaram, produces primes smaller 
    # than (2*x + 2) for a number given number x. Since 
    # we want primes smaller than MAX, we reduce MAX to half 
    # This array is used to separate numbers of the form 
    # i+j+2ij from others where 1 <= i <= j 
    marked=[False]*(int(MAX/2)+1); 
  
    # Main logic of Sundaram. Mark all numbers which 
    # do not generate prime number by doing 2*i+1 
    for i in range(1,int((math.sqrt(MAX)-1)/2)+1): 
        for j in range(((i*(i+1))<<1),(int(MAX/2)+1),(2*i+1)): 
            marked[j] = True; 
  
    # Since 2 is a prime number 
    primes.append(2); 
  
    # Print other primes. Remaining primes are of the 
    # form 2*i + 1 such that marked[i] is false. 
    for i in range(1,int(MAX/2)): 
        if (marked[i] == False): 
            primes.append(2*i + 1); 
  
# Function to calculate primorial of n 
def calculatePrimorial(n): 
    # Multiply first n primes 
    result = 1; 
    for i in range(n):
        result = result * primes[i]; 
    return result; 
  
# Driver code 
n = 5; 
sieveSundaram(); 
for i in range(1,n+1):
    print("Primorial(P#) of",i,"is",calculatePrimorial(i)); 
  
# This code is contributed by mits


C#
// C# program to find Primorial of given numbers 
using System; 
using System.Collections;
  
class GFG{
  
public static int MAX = 1000000;
  
// vector to store all prime less than and equal to 10^6 
static ArrayList primes = new ArrayList();
  
// Function for sieve of sundaram. This function stores all 
// prime numbers less than MAX in primes 
static void sieveSundaram()
{
    // In general Sieve of Sundaram, produces primes smaller 
    // than (2*x + 2) for a number given number x. Since 
    // we want primes smaller than MAX, we reduce MAX to half 
    // This array is used to separate numbers of the form 
    // i+j+2ij from others where 1 <= i <= j 
    bool[] marked = new bool[MAX];
  
    // Main logic of Sundaram. Mark all numbers which 
    // do not generate prime number by doing 2*i+1 
    for (int i = 1; i <= (Math.Sqrt(MAX) - 1) / 2 ; i++)
    {
        for (int j = (i * (i + 1)) << 1 ; j <= MAX / 2 ; j += 2 * i + 1)
        {
            marked[j] = true;
        }
    }
  
    // Since 2 is a prime number 
    primes.Add(2);
  
    // Print other primes. Remaining primes are of the 
    // form 2*i + 1 such that marked[i] is false. 
    for (int i = 1; i <= MAX / 2; i++)
    {
        if (marked[i] == false)
        {
            primes.Add(2 * i + 1);
        }
    }
}
  
// Function to calculate primorial of n 
static int calculatePrimorial(int n)
{
    // Multiply first n primes 
    int result = 1;
    for (int i = 0; i < n; i++)
    {
    result = result * (int)primes[i];
    }
    return result;
}
  
// Driver code 
public static void Main()
{
    int n = 5;
    sieveSundaram();
    for (int i = 1 ; i <= n; i++)
    {
        System.Console.WriteLine("Primorial(P#) of "+i+" is "+calculatePrimorial(i));
    }
}
}
// This Code is contributed by mits


PHP


输出:

Primorial(P#) of 1 is 2
Primorial(P#) of 2 is 6
Primorial(P#) of 3 is 30
Primorial(P#) of 4 is 210
Primorial(P#) of 5 is 2310