📜  找出N以下所有可截短的素数之和

📅  最后修改于: 2021-04-22 02:48:45             🧑  作者: Mango

给定一个整数N ,任务是找到N以下所有可截断的素数之和。可截断的质数是一个可左截断的质数(如果连续删除前导(“左”)数字,则所有结果数均为质数)以及可右截断的质数(如果最后一个(“右”)数为依次删除,则所有生成的数字均为质数)。
例如,3797是左截短的素数,因为797、97和7是素数。而且,3797也是右截数素数,因为379、37和3是素数。因此3797是可截短的素数。

例子:

方法:一种有效的方法是使用Eratosthenes筛子查找所有质数,对于N以下的每个数字,检查其是否为可截断质数。如果是,则将累加到运行总和中。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
#define N 1000005
  
// To check if a number is prime or not
bool prime[N];
  
// Sieve of Eratosthenes
// function to find all prime numbers
void sieve()
{
    memset(prime, true, sizeof prime);
    prime[1] = false;
    prime[0] = false;
  
    for (int i = 2; i < N; i++)
        if (prime[i])
            for (int j = i * 2; j < N; j += i)
                prime[j] = false;
}
  
// Function to return the sum of
// all truncatable primes below n
int sumTruncatablePrimes(int n)
{
    // To store the required sum
    int sum = 0;
  
    // Check every number below n
    for (int i = 2; i < n; i++) {
  
        int num = i;
        bool flag = true;
  
        // Check from right to left
        while (num) {
  
            // If number is not prime at any stage
            if (!prime[num]) {
                flag = false;
                break;
            }
            num /= 10;
        }
  
        num = i;
        int power = 10;
  
        // Check from left to right
        while (num / power) {
  
            // If number is not prime at any stage
            if (!prime[num % power]) {
                flag = false;
                break;
            }
            power *= 10;
        }
  
        // If flag is still true
        if (flag)
            sum += i;
    }
  
    // Return the required sum
    return sum;
}
  
// Driver code
int main()
{
    int n = 25;
    sieve();
    cout << sumTruncatablePrimes(n);
  
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
  
class GFG 
{
  
    static final int N = 1000005;
  
    // To check if a number is prime or not
    static boolean prime[] = new boolean[N];
  
    // Sieve of Eratosthenes
    // function to find all prime numbers
    static void sieve() 
    {
        Arrays.fill(prime, true);
        prime[1] = false;
        prime[0] = false;
  
        for (int i = 2; i < N; i++) 
        {
            if (prime[i]) 
            {
                for (int j = i * 2; j < N; j += i)
                {
                    prime[j] = false;
                }
            }
        }
    }
  
    // Function to return the sum of
    // all truncatable primes below n
    static int sumTruncatablePrimes(int n) 
    {
        // To store the required sum
        int sum = 0;
  
        // Check every number below n
        for (int i = 2; i < n; i++) 
        {
  
            int num = i;
            boolean flag = true;
  
            // Check from right to left
            while (num > 0)
            {
  
                // If number is not prime at any stage
                if (!prime[num]) 
                {
                    flag = false;
                    break;
                }
                num /= 10;
            }
  
            num = i;
            int power = 10;
  
            // Check from left to right
            while (num / power > 0)
            {
  
                // If number is not prime at any stage
                if (!prime[num % power])
                {
                    flag = false;
                    break;
                }
                power *= 10;
            }
  
            // If flag is still true
            if (flag) 
            {
                sum += i;
            }
        }
  
        // Return the required sum
        return sum;
    }
  
    // Driver code
    public static void main(String[] args) 
    {
        int n = 25;
        sieve();
        System.out.println(sumTruncatablePrimes(n));
    }
}
  
// This code contributed by Rajput-Ji


Python3
# Python3 implementation of the 
# above approach 
N = 1000005
  
# To check if a number is prime or not
prime = [True for i in range(N)]
  
# Sieve of Eratosthenes
# function to find all prime numbers
def sieve():
    prime[1] = False
    prime[0] = False
  
    for i in range(2, N):
        if (prime[i]==True):
            for j in range(i * 2, N, i):
                prime[j] = False
  
# Function to return the sum of
# all truncatable primes below n
def sumTruncatablePrimes(n):
  
    # To store the required sum
    sum = 0
  
    # Check every number below n
    for i in range(2, n):
  
        num = i
        flag = True
  
        # Check from right to left
        while (num):
  
            # If number is not prime at any stage
            if (prime[num] == False):
                flag = False
                break
  
            num //= 10
  
        num = i
        power = 10
  
        # Check from left to right
        while (num // power):
  
            # If number is not prime at any stage
            if (prime[num % power] == False):
                flag = False
                break
  
            power *= 10
  
        # If flag is still true
        if (flag==True):
            sum += i
  
    # Return the required sum
    return sum
  
# Driver code
n = 25
sieve()
print(sumTruncatablePrimes(n))
  
# This code is contributed by mohit kumar


C#
// C# implementation of the above approach. 
using System;
using System.Collections.Generic;
  
class GFG 
{ 
  
    static int N = 1000005; 
  
    // To check if a number is prime or not 
    static Boolean []prime = new Boolean[N]; 
  
    // Sieve of Eratosthenes 
    // function to find all prime numbers 
    static void sieve() 
    { 
        Array.Fill(prime, true); 
        prime[1] = false; 
        prime[0] = false; 
  
        for (int i = 2; i < N; i++) 
        { 
            if (prime[i]) 
            { 
                for (int j = i * 2; j < N; j += i) 
                { 
                    prime[j] = false; 
                } 
            } 
        } 
    } 
  
    // Function to return the sum of 
    // all truncatable primes below n 
    static int sumTruncatablePrimes(int n) 
    { 
        // To store the required sum 
        int sum = 0; 
  
        // Check every number below n 
        for (int i = 2; i < n; i++) 
        { 
  
            int num = i; 
            Boolean flag = true; 
  
            // Check from right to left 
            while (num > 0) 
            { 
  
                // If number is not prime at any stage 
                if (!prime[num]) 
                { 
                    flag = false; 
                    break; 
                } 
                num /= 10; 
            } 
  
            num = i; 
            int power = 10; 
  
            // Check from left to right 
            while (num / power > 0) 
            { 
  
                // If number is not prime at any stage 
                if (!prime[num % power]) 
                { 
                    flag = false; 
                    break; 
                } 
                power *= 10; 
            } 
  
            // If flag is still true 
            if (flag) 
            { 
                sum += i; 
            } 
        } 
  
        // Return the required sum 
        return sum; 
    } 
  
    // Driver code 
    public static void Main(String []args) 
    { 
        int n = 25; 
        sieve(); 
        Console.WriteLine(sumTruncatablePrimes(n)); 
    } 
  
} 
  
// This code has been contributed by Arnab Kundu


PHP


输出:
40