Sum of Maximum and Minimum prime factor of every number in the Array
Last Updated :
30 Jan, 2022
Given an array arr[], the task is to find the sum of the maximum and the minimum prime factor of every number in the given array.
Examples:
Input: arr[] = {15}
Output: 8
The maximum and the minimum prime factors
of 15 are 5 and 3 respectively.
Input: arr[] = {5, 10, 15, 20, 25, 30}
Output: 10 7 8 7 10 7
Approach: The idea is to use Sieve of Eratosthenes to precompute all the minimum and maximum prime factors of every number and store it in two arrays. After this precomputation, the sum of the minimum and the maximum prime factor can be found in constant time.
Below is the implementation of the above approach:
CPP
#include <bits/stdc++.h>
using namespace std;
const int MAX = 100000;
int max_prime[MAX];
int min_prime[MAX];
void sieve( int n)
{
for ( int i = 2; i <= n; ++i) {
if (min_prime[i] > 0) {
continue ;
}
min_prime[i] = i;
max_prime[i] = i;
int j = i + i;
while (j <= n) {
if (min_prime[j] == 0) {
min_prime[j] = i;
}
max_prime[j] = i;
j += i;
}
}
}
void findSum( int arr[], int n)
{
sieve(MAX);
for ( int i = 0; i < n; i++) {
int sum = min_prime[arr[i]]
+ max_prime[arr[i]];
cout << sum << " " ;
}
}
int main()
{
int arr[] = { 5, 10, 15, 20, 25, 30 };
int n = sizeof (arr) / sizeof ( int );
findSum(arr, n);
return 0;
}
|
Java
class GFG
{
static int MAX = 100000 ;
static int max_prime[] = new int [MAX + 1 ];
static int min_prime[] = new int [MAX + 1 ];
static void sieve( int n)
{
for ( int i = 2 ; i <= n; ++i)
{
if (min_prime[i] > 0 )
{
continue ;
}
min_prime[i] = i;
max_prime[i] = i;
int j = i + i;
while (j <= n)
{
if (min_prime[j] == 0 )
{
min_prime[j] = i;
}
max_prime[j] = i;
j += i;
}
}
}
static void findSum( int arr[], int n)
{
sieve(MAX);
for ( int i = 0 ; i < n; i++)
{
int sum = min_prime[arr[i]]
+ max_prime[arr[i]];
System.out.print(sum + " " );
}
}
public static void main (String[] args)
{
int arr[] = { 5 , 10 , 15 , 20 , 25 , 30 };
int n = arr.length ;
findSum(arr, n);
}
}
|
Python
MAX = 100000
max_prime = [ 0 ] * ( MAX + 1 )
min_prime = [ 0 ] * ( MAX + 1 )
def sieve(n):
for i in range ( 2 , n + 1 ):
if (min_prime[i] > 0 ):
continue
min_prime[i] = i
max_prime[i] = i
j = i + i
while (j < = n):
if (min_prime[j] = = 0 ):
min_prime[j] = i
max_prime[j] = i
j + = i
def findSum(arr, n):
sieve( MAX )
for i in range (n):
sum = min_prime[arr[i]] + max_prime[arr[i]]
print ( sum , end = " " )
arr = [ 5 , 10 , 15 , 20 , 25 , 30 ]
n = len (arr)
findSum(arr, n)
|
C#
using System;
class GFG
{
static int MAX = 100000;
static int []max_prime = new int [MAX + 1];
static int []min_prime = new int [MAX + 1];
static void sieve( int n)
{
for ( int i = 2; i <= n; ++i)
{
if (min_prime[i] > 0)
{
continue ;
}
min_prime[i] = i;
max_prime[i] = i;
int j = i + i;
while (j <= n)
{
if (min_prime[j] == 0)
{
min_prime[j] = i;
}
max_prime[j] = i;
j += i;
}
}
}
static void findSum( int []arr, int n)
{
sieve(MAX);
for ( int i = 0; i < n; i++)
{
int sum = min_prime[arr[i]]
+ max_prime[arr[i]];
Console.Write(sum + " " );
}
}
public static void Main(String[] args)
{
int []arr = { 5, 10, 15, 20, 25, 30 };
int n = arr.Length ;
findSum(arr, n);
}
}
|
Javascript
<script>
var MAX = 100000;
var max_prime = Array.from({length: MAX + 1}, (_, i) => 0);
var min_prime = Array.from({length: MAX + 1}, (_, i) => 0);
function sieve(n)
{
for ( var i = 2; i <= n; ++i)
{
if (min_prime[i] > 0)
{
continue ;
}
min_prime[i] = i;
max_prime[i] = i;
var j = i + i;
while (j <= n)
{
if (min_prime[j] == 0)
{
min_prime[j] = i;
}
max_prime[j] = i;
j += i;
}
}
}
function findSum(arr , n)
{
sieve(MAX);
for (i = 0; i < n; i++)
{
var sum = min_prime[arr[i]]
+ max_prime[arr[i]];
document.write(sum + " " );
}
}
var arr = [ 5, 10, 15, 20, 25, 30 ];
var n = arr.length ;
findSum(arr, n);
</script>
|
Time Complexity: O(n2)
Auxiliary Space: O(100000)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...