📜  在数组中打印质数和质数之和

📅  最后修改于: 2021-05-07 06:37:43             🧑  作者: Mango

给定数组arr [] ,任务是在数组中打印加法素数。
添加剂素数:素数,使得其数字的总和也是一个素数,如2,3,7,11,23是相加的素数,但不13,19,31等。

例子:

Input: arr[] = {2, 4, 6, 11, 12, 18, 7}
Output: 2, 11, 7 

Input: arr[] = {2, 3, 19, 13, 25, 7}
Output: 2, 3, 7

一种简单的方法是遍历所有数组元素。对于每个元素,检查其是否为“可加素数”。

当数组较小或数组值较大时,上述方法很好。对于具有相对较小值的大型数组,我们使用Sieve来存储素数,直到数组的最大元素。然后检查当前元素是否为质数。如果是,则检查其数字的总和是否也是素数。如果是,则打印该号码。

下面是上述方法的实现:

C++
// C++ implementation of the above approach
#include 
using namespace std;
  
// Function to store the primes
void sieve(int maxEle, int prime[])
{
    prime[0] = prime[1] = 1;
  
    for (int i = 2; i * i <= maxEle; i++) {
        if (!prime[i]) {
            for (int j = 2 * i; j <= maxEle; j += i)
                prime[j] = 1;
        }
    }
}
  
// Function to return the sum of digits
int digitSum(int n)
{
    int sum = 0;
    while (n) {
        sum += n % 10;
        n = n / 10;
    }
    return sum;
}
  
// Function to print additive primes
void printAdditivePrime(int arr[], int n)
{
  
    int maxEle = *max_element(arr, arr + n);
  
    int prime[maxEle + 1];
    memset(prime, 0, sizeof(prime));
    sieve(maxEle, prime);
  
    for (int i = 0; i < n; i++) {
  
        // If the number is prime
        if (prime[arr[i]] == 0) {
            int sum = digitSum(arr[i]);
  
            // Check if it's digit sum is prime
            if (prime[sum] == 0)
                cout << arr[i] << " ";
        }
    }
}
  
// Driver code
int main()
{
  
    int a[] = { 2, 4, 6, 11, 12, 18, 7 };
    int n = sizeof(a) / sizeof(a[0]);
  
    printAdditivePrime(a, n);
  
    return 0;
}


Java
// Java implementation of the above approach
import java.util.Arrays;
  
class GFG
{
      
// Function to store the primes
static void sieve(int maxEle, int prime[])
{
    prime[0] = prime[1] = 1;
  
    for (int i = 2; i * i <= maxEle; i++) 
    {
        if (prime[i]==0)
        {
            for (int j = 2 * i; j <= maxEle; j += i)
                prime[j] = 1;
        }
    }
}
  
// Function to return the sum of digits
static int digitSum(int n)
{
    int sum = 0;
    while (n > 0) 
    {
        sum += n % 10;
        n = n / 10;
    }
    return sum;
}
  
// Function to print additive primes
static void printAdditivePrime(int arr[], int n)
{
  
    int maxEle = Arrays.stream(arr).max().getAsInt();
  
    int prime[] = new int[maxEle + 1];
    sieve(maxEle, prime);
  
    for (int i = 0; i < n; i++) 
    {
  
        // If the number is prime
        if (prime[arr[i]] == 0) 
        {
            int sum = digitSum(arr[i]);
  
            // Check if it's digit sum is prime
            if (prime[sum] == 0)
                System.out.print(arr[i]+" ");
        }
    }
}
  
// Driver code
public static void main(String[] args)
{
  
    int a[] = { 2, 4, 6, 11, 12, 18, 7 };
    int n =a.length;
    printAdditivePrime(a, n);
}
}
  
// This code is contributed by chandan_jnu


Python3
# Python3 implementation of the 
# above approach 
  
# from math lib import sqrt
from math import sqrt
  
# Function to store the primes 
def sieve(maxEle, prime) :
      
    prime[0], prime[1] = 1 , 1
  
    for i in range(2, int(sqrt(maxEle)) + 1) :
        if (not prime[i]) :
            for j in range(2 * i , maxEle + 1, i) :
                prime[j] = 1
      
# Function to return the sum of digits 
def digitSum(n) : 
    sum = 0
    while (n) :
          
        sum += n % 10
        n = n // 10
    return sum
  
# Function to print additive primes
def printAdditivePrime(arr, n):
    maxEle = max(arr)
    prime = [0] * (maxEle + 1)
    sieve(maxEle, prime)
    for i in range(n) :
          
        # If the number is prime
        if (prime[arr[i]] == 0):
            sum = digitSum(arr[i])
              
            # Check if it's digit sum is prime
            if (prime[sum] == 0) :
                print(arr[i], end = " ") 
      
# Driver code 
if __name__ == "__main__" :
    a = [ 2, 4, 6, 11, 12, 18, 7 ]
    n = len(a)
    printAdditivePrime(a, n) 
  
# This code is contributed by Ryuga


C#
// C# implementation of the above approach
using System.Linq;
using System;
  
class GFG
{
      
// Function to store the primes
static void sieve(int maxEle, int[] prime)
{
    prime[0] = prime[1] = 1;
  
    for (int i = 2; i * i <= maxEle; i++) 
    {
        if (prime[i] == 0)
        {
            for (int j = 2 * i; j <= maxEle; j += i)
                prime[j] = 1;
        }
    }
}
  
// Function to return the sum of digits
static int digitSum(int n)
{
    int sum = 0;
    while (n > 0) 
    {
        sum += n % 10;
        n = n / 10;
    }
    return sum;
}
  
// Function to print additive primes
static void printAdditivePrime(int []arr, int n)
{
  
    int maxEle = arr.Max();
  
    int[] prime = new int[maxEle + 1];
    sieve(maxEle, prime);
  
    for (int i = 0; i < n; i++) 
    {
  
        // If the number is prime
        if (prime[arr[i]] == 0) 
        {
            int sum = digitSum(arr[i]);
  
            // Check if it's digit sum is prime
            if (prime[sum] == 0)
                Console.Write(arr[i] + " ");
        }
    }
}
  
// Driver code
static void Main()
{
    int[] a = { 2, 4, 6, 11, 12, 18, 7 };
    int n = a.Length;
    printAdditivePrime(a, n);
}
}
  
// This code is contributed by chandan_jnu


PHP


输出:
2 11 7