Sum of Semi-Prime Numbers less than or equal to N
Last Updated :
31 May, 2022
Given an integer N, the task is to find the sum of semi-prime numbers which are less than or equal to N. A Semi prime number is a number that is a multiple of two prime numbers.
Examples:
Input: N = 6
Output: 10
4 and 6 are the semi primes ? 6
4 + 6 = 10
Input: N = 10000000
Output: 9322298311255
Approach:
- First Calculate the primes less than or equal to N using Sieve and store them in a vector in sorted order.
- Iterate over the vector of primes. Fix one of the primes and starting checking the value of the product of all primes with this fixed prime.
- As the primes are arranged in sorted order, once we find a prime for which the product exceeds N, then it would exceed for all remaining primes. Hence, break the nested loop here.
- Add the product value to the answer variable for all valid pairs.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
vector<ll> pr;
bool prime[10000000 + 1];
void sieve(ll n)
{
for ( int i = 2; i <= n; i += 1) {
prime[i] = 1;
}
for (ll p = 2; (ll)p * (ll)p <= n; p++) {
if (prime[p] == true ) {
for (ll i = (ll)p * (ll)p; i <= n; i += p)
prime[i] = false ;
}
}
for (ll p = 2; p <= n; p++)
if (prime[p])
pr.push_back(p);
}
ll SemiPrimeSum(ll N)
{
ll ans = 0;
for ( int i = 0; i < pr.size(); i += 1) {
for ( int j = i; j < pr.size(); j += 1) {
if ((ll)pr[i] * (ll)pr[j] > N)
break ;
ans += (ll)pr[i] * (ll)pr[j];
}
}
return ans;
}
int main()
{
ll N = 6;
sieve(N);
cout << SemiPrimeSum(N);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static Vector<Long> pr = new Vector<>();
static boolean prime[] = new boolean [ 10000000 + 1 ];
static void sieve( long n)
{
for ( int i = 2 ; i <= n; i += 1 )
{
prime[i] = true ;
}
for ( int p = 2 ; ( int )p * ( int )p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = ( int )p * ( int )p; i <= n; i += p)
prime[i] = false ;
}
}
for ( int p = 2 ; p <= n; p++)
if (prime[p])
pr.add(( long )p);
}
static long SemiPrimeSum( long N)
{
long ans = 0 ;
for ( int i = 0 ; i < pr.size(); i += 1 )
{
for ( int j = i; j < pr.size(); j += 1 )
{
if (( long )pr.get(i) * ( long )pr.get(j) > N)
break ;
ans += ( long )pr.get(i) * ( long )pr.get(j);
}
}
return ans;
}
public static void main(String[] args)
{
long N = 6 ;
sieve(N);
System.out.println(SemiPrimeSum(N));
}
}
|
Python3
pr = []
prime = [ 1 for i in range ( 10000000 + 1 )]
def sieve(n):
for p in range ( 2 , n):
if p * p > n:
break
if (prime[p] = = True ):
for i in range ( 2 * p, n + 1 , p):
prime[i] = False
for p in range ( 2 , n + 1 ):
if (prime[p]):
pr.append(p)
def SemiPrimeSum(N):
ans = 0
for i in range ( len (pr)):
for j in range (i, len (pr)):
if (pr[i] * pr[j] > N):
break
ans + = pr[i] * pr[j]
return ans
N = 6
sieve(N)
print (SemiPrimeSum(N))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static List< long > pr = new List< long >();
static bool []prime = new bool [10000000 + 1];
static void sieve( long n)
{
for ( int i = 2; i <= n; i += 1)
{
prime[i] = true ;
}
for ( int p = 2; ( int )p * ( int )p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = ( int )p * ( int )p; i <= n; i += p)
prime[i] = false ;
}
}
for ( int p = 2; p <= n; p++)
if (prime[p])
pr.Add(( long )p);
}
static long SemiPrimeSum( long N)
{
long ans = 0;
for ( int i = 0; i < pr.Count; i += 1)
{
for ( int j = i; j < pr.Count; j += 1)
{
if (( long )pr[i] * ( long )pr[j] > N)
break ;
ans += ( long )pr[i] * ( long )pr[j];
}
}
return ans;
}
public static void Main(String[] args)
{
long N = 6;
sieve(N);
Console.WriteLine(SemiPrimeSum(N));
}
}
|
Javascript
<script>
let pr = [];
let prime = new Array(10000000 + 1);
function sieve(n)
{
for (let i = 2; i <= n; i += 1) {
prime[i] = 1;
}
for (let p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
for (let i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
for (let p = 2; p <= n; p++)
if (prime[p])
pr.push(p);
}
function SemiPrimeSum(N)
{
let ans = 0;
for (let i = 0; i < pr.length; i += 1) {
for (let j = i; j < pr.length; j += 1) {
if (pr[i] * pr[j] > N)
break ;
ans += pr[i] * pr[j];
}
}
return ans;
}
let N = 6;
sieve(N);
document.write(SemiPrimeSum(N));
</script>
|
Auxiliary Space: O(10000000)
Share your thoughts in the comments
Please Login to comment...