📜  总理三胞胎

📅  最后修改于: 2021-04-27 19:51:38             🧑  作者: Mango

素数三元是一组三个素数,其形式为( p,p + 2,p + 6 )或( p,p + 4,p + 6 )。这是三个质数的最接近的分组,因为每三个连续奇数之一是3的倍数,因此除了(2,3,5)和(3,5,7)以外都不是质数(除了3本身)。 )。

例子 :

Input : n = 15
Output : 5 7 11
         7 11 13

Input : n = 25
Output : 5 7 11
         7 11 13
         11 13 17
         13 17 19
         17 19 23

一个简单的解决方案是遍历从1到n-6的所有数字。对于每个数字,我检查i,i + 2,i + 6或i,i + 4,i + 6是否为质数。如果是,请打印三元组。

一个有效的解决方案是使用Eratosthenes筛子首先查找所有质数,以便我们可以快速检查一个数是否为质数。

下面是该方法的实现。

C++
// C++ program to find prime triplets smaller
// than or equal to n.
#include 
using namespace std;
  
// function to detect prime number
// here we have used sieve method
// https://www.geeksforgeeks.org/sieve-of-eratosthenes/
// to detect prime number
void sieve(int n, bool prime[])
{
    for (int p = 2; p * p <= n; p++) {
  
        // If prime[p] is not changed, then it is a prime
        if (prime[p] == true) {
  
            // Update all multiples of p
            for (int i = p * 2; i <= n; i += p)
                prime[i] = false;
        }
    }
}
  
// function to print prime triplets
void printPrimeTriplets(int n)
{
    // Finding all primes from 1 to n
    bool prime[n + 1];
    memset(prime, true, sizeof(prime));
    sieve(n, prime);
      
    cout << "The prime triplets from 1 to " 
          << n << "are :" << endl;
    for (int i = 2; i <= n-6; ++i) {
  
        // triplets of form (p, p+2, p+6)
        if (prime[i] && prime[i + 2] && prime[i + 6])
            cout << i << " " << (i + 2) << " " << (i + 6) << endl;
  
        // triplets of form (p, p+4, p+6)
        else if (prime[i] && prime[i + 4] && prime[i + 6])
            cout << i << " " << (i + 4) << " " << (i + 6) << endl;
    }
}
  
int main()
{
    int n = 25;
    printPrimeTriplets(n);
    return 0;
}


Java
// Java program to find prime triplets
// smaller than or equal to n.
import java.io.*;
import java.util.*;
  
class GFG {
      
// function to detect prime number
// here we have used sieve method
// https://www.geeksforgeeks.org/sieve-of-eratosthenes/
// to detect prime number
    static void sieve(int n, boolean prime[])
    {
        for (int p = 2; p * p <= n; p++) {
      
            // If prime[p] is not changed,
            //then it is a prime
            if (prime[p] == true) {
      
                // Update all multiples of p
                for (int i = p * 2; i <= n; i += p)
                    prime[i] = false;
            }
        }
    }
      
    // function to print prime triplets
    static void printPrimeTriplets(int n)
    {
        // Finding all primes from 1 to n
        boolean prime[]=new boolean[n + 1];
        Arrays.fill(prime,true);
        sieve(n, prime);
          
        System.out.println("The prime triplets"+
                           " from 1 to " + n + "are :");
          
        for (int i = 2; i <= n-6; ++i) {
      
            // triplets of form (p, p+2, p+6)
            if (prime[i] && prime[i + 2] && prime[i + 6])
                System.out.println( i + " " + (i + 2) + 
                                    " " + (i + 6));
      
            // triplets of form (p, p+4, p+6)
            else if (prime[i] && prime[i + 4] && 
                     prime[i + 6])
                  
                System.out.println(i + " " + (i + 4) +
                                   " " + (i + 6));
        }
    }
      
    public static void main(String args[])
    {
        int n = 25;
        printPrimeTriplets(n);
    }
}
  
  
 /*This code is contributed by Nikita Tiwari.*/


Python3
# Python 3 program to find 
# prime triplets smaller
# than or equal to n.
  
# function to detect prime number
# using sieve method
# https://www.geeksforgeeks.org/sieve-of-eratosthenes/
# to detect prime number
def sieve(n, prime) :
      
    p = 2
      
    while (p * p <= n ) :
          
        # If prime[p] is not changed
        # , then it is a prime
        if (prime[p] == True) :
              
            # Update all multiples of p
            i = p * 2
          
            while ( i <= n ) :
                prime[i] = False
                i = i + p
          
        p = p + 1
          
  
# function to print 
# prime triplets
def printPrimeTriplets(n) :
  
    # Finding all primes 
    # from 1 to n
    prime = [True] * (n + 1)
    sieve(n, prime)
      
    print( "The prime triplets from 1 to ",
                               n , "are :")
      
    for i in range(2, n - 6 + 1) :
          
        # triplets of form (p, p+2, p+6)
        if (prime[i] and prime[i + 2] and
                            prime[i + 6]) :
            print( i , (i + 2) , (i + 6))
              
        # triplets of form (p, p+4, p+6)
        elif (prime[i] and prime[i + 4] and
                            prime[i + 6]) :
            print(i , (i + 4) , (i + 6))
              
# Driver code
n = 25
printPrimeTriplets(n)
  
# This code is contributed by Nikita Tiwari.


C#
// C# program to find prime 
// triplets smaller than or
// equal to n.
using System;
  
class GFG 
{
      
// function to detect 
// prime number
static void sieve(int n, 
                  bool[] prime)
{
    for (int p = 2; 
             p * p <= n; p++) 
    {
  
        // If prime[p] is not changed,
        // then it is a prime
        if (prime[p] == false) 
        {
  
            // Update all multiples of p
            for (int i = p * 2; 
                     i <= n; i += p)
                prime[i] = true;
        }
    }
}
  
// function to print
// prime triplets
static void printPrimeTriplets(int n)
{
    // Finding all primes
    // from 1 to n
    bool[] prime = new bool[n + 1];
    sieve(n, prime);
      
    Console.WriteLine("The prime triplets " + 
                               "from 1 to " + 
                               n + " are :");
      
    for (int i = 2; i <= n - 6; ++i) 
    {
  
        // triplets of form (p, p+2, p+6)
        if (!prime[i] && 
            !prime[i + 2] && 
            !prime[i + 6])
            Console.WriteLine(i + " " + (i + 2) + 
                                  " " + (i + 6));
  
        // triplets of form (p, p+4, p+6)
        else if (!prime[i] && 
                 !prime[i + 4] && 
                 !prime[i + 6])
            Console.WriteLine(i + " " + (i + 4) + 
                                  " " + (i + 6));
    }
}
  
// Driver Code
public static void Main()
{
    int n = 25;
    printPrimeTriplets(n);
}
}
  
// This code is contributed by mits


PHP


输出 :

The prime triplets from 1 to 25 are :
5 7 11
7 11 13
11 13 17
13 17 19
17 19 23

参考 :
维基