Find the sum of all Truncatable primes below N
Last Updated :
15 Jun, 2022
Given an integer N, the task is to find the sum of all Truncatable primes below N. Truncatable prime is a number which is left-truncatable prime (if the leading (“left”) digit is successively removed, then all resulting numbers are prime) as well as right-truncatable prime (if the last (“right”) digit is successively removed, then all the resulting numbers are prime).
For example, 3797 is left-truncatable prime because 797, 97 and 7 are primes. And, 3797 is also right-truncatable prime as 379, 37, and 3 are primes. Hence 3797 is a truncatable prime.
Examples:
Input: N = 25
Output: 40
2, 3, 5, 7 and 23 are the only truncatable primes below 25.
2 + 3 + 5 + 7 + 23 = 40
Input: N = 40
Output: 77
Approach: An efficient approach is to find all the prime numbers using Sieve of Eratosthenes and for every number below N check whether it is Truncatable prime or not. If yes then add is to the running sum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
bool prime[N];
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 ;
}
int sumTruncatablePrimes( int n)
{
int sum = 0;
for ( int i = 2; i < n; i++) {
int num = i;
bool flag = true ;
while (num) {
if (!prime[num]) {
flag = false ;
break ;
}
num /= 10;
}
num = i;
int power = 10;
while (num / power) {
if (!prime[num % power]) {
flag = false ;
break ;
}
power *= 10;
}
if (flag)
sum += i;
}
return sum;
}
int main()
{
int n = 25;
sieve();
cout << sumTruncatablePrimes(n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static final int N = 1000005 ;
static boolean prime[] = new boolean [N];
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 ;
}
}
}
}
static int sumTruncatablePrimes( int n)
{
int sum = 0 ;
for ( int i = 2 ; i < n; i++)
{
int num = i;
boolean flag = true ;
while (num > 0 )
{
if (!prime[num])
{
flag = false ;
break ;
}
num /= 10 ;
}
num = i;
int power = 10 ;
while (num / power > 0 )
{
if (!prime[num % power])
{
flag = false ;
break ;
}
power *= 10 ;
}
if (flag)
{
sum += i;
}
}
return sum;
}
public static void main(String[] args)
{
int n = 25 ;
sieve();
System.out.println(sumTruncatablePrimes(n));
}
}
|
Python3
N = 1000005
prime = [ True for i in range (N)]
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
def sumTruncatablePrimes(n):
sum = 0
for i in range ( 2 , n):
num = i
flag = True
while (num):
if (prime[num] = = False ):
flag = False
break
num / / = 10
num = i
power = 10
while (num / / power):
if (prime[num % power] = = False ):
flag = False
break
power * = 10
if (flag = = True ):
sum + = i
return sum
n = 25
sieve()
print (sumTruncatablePrimes(n))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int N = 1000005;
static Boolean []prime = new Boolean[N];
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 ;
}
}
}
}
static int sumTruncatablePrimes( int n)
{
int sum = 0;
for ( int i = 2; i < n; i++)
{
int num = i;
Boolean flag = true ;
while (num > 0)
{
if (!prime[num])
{
flag = false ;
break ;
}
num /= 10;
}
num = i;
int power = 10;
while (num / power > 0)
{
if (!prime[num % power])
{
flag = false ;
break ;
}
power *= 10;
}
if (flag)
{
sum += i;
}
}
return sum;
}
public static void Main(String []args)
{
int n = 25;
sieve();
Console.WriteLine(sumTruncatablePrimes(n));
}
}
|
PHP
<?php
$N = 10005;
$prime = array_fill (0, $N , true);
function sieve()
{
global $prime , $N ;
$prime [1] = false;
$prime [0] = false;
for ( $i = 2; $i < $N ; $i ++)
if ( $prime [ $i ])
for ( $j = $i * 2; $j < $N ; $j += $i )
$prime [ $j ] = false;
}
function sumTruncatablePrimes( $n )
{
global $prime , $N ;
$sum = 0;
for ( $i = 2; $i < $n ; $i ++)
{
$num = $i ;
$flag = true;
while ( $num )
{
if (! $prime [ $num ])
{
$flag = false;
break ;
}
$num = (int)( $num / 10);
}
$num = $i ;
$power = 10;
while ((int)( $num / $power ))
{
if (! $prime [ $num % $power ])
{
$flag = false;
break ;
}
$power *= 10;
}
if ( $flag )
$sum += $i ;
}
return $sum ;
}
$n = 25;
sieve();
echo sumTruncatablePrimes( $n );
?>
|
Javascript
<script>
let N = 1000005;
let prime = new Array(N);
function sieve()
{
for (let i = 0; i < prime.length; i++)
{
prime[i] = true ;
}
prime[1] = false ;
prime[0] = false ;
for (let i = 2; i < N; i++)
{
if (prime[i])
{
for (let j = i * 2; j < N; j += i)
{
prime[j] = false ;
}
}
}
}
function sumTruncatablePrimes(n)
{
let sum = 0;
for (let i = 2; i < n; i++)
{
let num = i;
let flag = true ;
while (num > 0)
{
if (!prime[num])
{
flag = false ;
break ;
}
num = Math.floor(num / 10);
}
num = i;
let power = 10;
while (num / power > 0)
{
if (!prime[num % power])
{
flag = false ;
break ;
}
power *= 10;
}
if (flag)
{
sum += i;
}
}
return sum;
}
let n = 25;
sieve();
document.write(sumTruncatablePrimes(n));
</script>
|
Time Complexity: O(n*log(log(n))), time used for running sieve function
Auxiliary Space: O(N), extra space of size n used to create an array prime
Share your thoughts in the comments
Please Login to comment...