Largest Divisor for each element in an array other than 1 and the number itself

30 Jan, 2022
Given an array arr[] of N integers, the task is to find the largest divisor for each element in an array other than 1 and the number itself. If there is no such divisor, print -1.
Examples:  
Input: arr[] = {5, 6, 7, 8, 9, 10} Output: -1 3 -1 4 3 5 Divisors(5) = {1, 5} -> Since there is no divisor other than 1 and the number itself, therefore largest divisor = -1 Divisors(6) = [1, 2, 3, 6] -> largest divisor other than 1 and the number itself = 3 Divisors(7) = [1, 7] -> Since there is no divisor other than 1 and the number itself, therefore largest divisor = -1 Divisors(8) = [1, 2, 4, 8] -> largest divisor other than 1 and the number itself = 4 Divisors(9) = [1, 3, 9] -> largest divisor other than 1 and the number itself = 3 Divisors(10) = [1, 2, 5, 10] -> largest divisor other than 1 and the number itself = 5
Input: arr[] = {15, 16, 17, 18, 19, 20, 21} Output: 5 8 -1 9 -1 10 7  
Naive approach: The idea is to iterate over all the array elements and find the largest divisor for each of the element using the approach discussed in this article. Time Complexity: O(N * √N)
Efficient approach: A better solution is to precompute the maximum divisor of the numbers from 2 to 105 and then just run a loop for array and print precomputed answer. 
Use Sieve of Eratosthenes to mark the prime numbers and store the smallest prime divisor of each number.
Now largest divisor for any number will be number / smallest_prime_divisor.
Find the Largest divisor for each number using the precomputed answer.
Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ implementation of the approach #include <bits/stdc++.h>using namespace std; #define int long longconst int maxin = 100001; // Divisors array to keep track// of the maximum divisorint divisors[maxin]; // Function to pre-compute the prime// numbers and largest divisorsvoid Calc_Max_Div(int arr[], int n){     // Visited array to keep    // track of prime numbers    bool vis[maxin];    memset(vis, 1, maxin);     // 0 and 1 are not prime numbers    vis[0] = vis[1] = 0;     // Initialising divisors[i] = i    for (int i = 1; i <= maxin; i++)        divisors[i] = i;     // For all the numbers divisible by 2    // the maximum divisor will be number / 2    for (int i = 4; i <= maxin; i += 2) {        vis[i] = 0;        divisors[i] = i / 2;    }    for (int i = 3; i <= maxin; i += 2) {         // If divisors[i] is not equal to i then        // this means that divisors[i] contains        // minimum prime divisor for the number        if (divisors[i] != i) {             // Update the answer to            // i / smallest_prime_divisor[i]            divisors[i] = i / divisors[i];        }         // Condition if i is a prime number        if (vis[i] == 1) {            for (int j = i * i; j < maxin; j += i) {                vis[j] = 0;                 // If divisors[j] is equal to j then                // this means that i is the first prime                // divisor for j so we update divi[j] = i                if (divisors[j] == j)                    divisors[j] = i;            }        }    }     for (int i = 0; i < n; i++) {         // If the current element is prime        // then it has no divisors        // other than 1 and itself        if (divisors[arr[i]] == arr[i])            cout << "-1 ";        else            cout << divisors[arr[i]] << " ";    }} // Driver codeint32_t main(){    int arr[] = { 5, 6, 7, 8, 9, 10 };    int n = sizeof(arr) / sizeof(int);     Calc_Max_Div(arr, n);     return 0;}
// Java implementation of the approachclass GFG{         final static int maxin = 10001;         // Divisors array to keep track    // of the maximum divisor    static int divisors[] = new int[maxin + 1];         // Function to pre-compute the prime    // numbers and largest divisors    static void Calc_Max_Div(int arr[], int n)    {             // Visited array to keep        // track of prime numbers        int vis[] = new int[maxin + 1];                 for(int i = 0;i <maxin+1 ; i++)            vis[i] = 1;         // 0 and 1 are not prime numbers        vis[0] = vis[1] = 0;             // Initialising divisors[i] = i        for (int i = 1; i <= maxin; i++)            divisors[i] = i;             // For all the numbers divisible by 2        // the maximum divisor will be number / 2        for (int i = 4; i <= maxin; i += 2)        {            vis[i] = 0;            divisors[i] = i / 2;        }        for (int i = 3; i <= maxin; i += 2)        {                 // If divisors[i] is not equal to i then            // this means that divisors[i] contains            // minimum prime divisor for the number            if (divisors[i] != i)            {                     // Update the answer to                // i / smallest_prime_divisor[i]                divisors[i] = i / divisors[i];            }                 // Condition if i is a prime number            if (vis[i] == 1)            {                for (int j = i * i; j < maxin; j += i)                {                    vis[j] = 0;                         // If divisors[j] is equal to j then                    // this means that i is the first prime                    // divisor for j so we update divi[j] = i                    if (divisors[j] == j)                        divisors[j] = i;                }            }        }             for (int i = 0; i < n; i++)        {                 // If the current element is prime            // then it has no divisors            // other than 1 and itself            if (divisors[arr[i]] == arr[i])                    System.out.print("-1 ");            else                    System.out.print(divisors[arr[i]] + " ");        }    }         // Driver code    public static void main (String[] args)    {        int []arr = { 5, 6, 7, 8, 9, 10 };        int n = arr.length;             Calc_Max_Div(arr, n);    }} // This code is contributed by AnkitRai01
# Python3 implementation of the approachmaxin = 100001; # Divisors array to keep track# of the maximum divisordivisors = [0] * (maxin + 1); # Function to pre-compute the prime# numbers and largest divisorsdef Calc_Max_Div(arr, n) :     # Visited array to keep    # track of prime numbers    vis = [1] * (maxin + 1);     # 0 and 1 are not prime numbers    vis[0] = vis[1] = 0;     # Initialising divisors[i] = i    for i in range(1, maxin + 1) :        divisors[i] = i;     # For all the numbers divisible by 2    # the maximum divisor will be number / 2    for i in range(4 , maxin + 1, 2) :        vis[i] = 0;        divisors[i] = i // 2;         for i in range(3, maxin + 1, 2) :         # If divisors[i] is not equal to i then        # this means that divisors[i] contains        # minimum prime divisor for the number        if (divisors[i] != i) :             # Update the answer to            # i / smallest_prime_divisor[i]            divisors[i] = i // divisors[i];             # Condition if i is a prime number        if (vis[i] == 1) :            for j in range( i * i, maxin, i) :                vis[j] = 0;                 # If divisors[j] is equal to j then                # this means that i is the first prime                # divisor for j so we update divi[j] = i                if (divisors[j] == j) :                    divisors[j] = i;             for i in range(n) :         # If the current element is prime        # then it has no divisors        # other than 1 and itself        if (divisors[arr[i]] == arr[i]) :            print("-1 ", end = "");        else :            print(divisors[arr[i]], end = " "); # Driver codeif __name__ == "__main__" :     arr = [ 5, 6, 7, 8, 9, 10 ];    n = len(arr);     Calc_Max_Div(arr, n); # This code is contributed by AnkitRai01
// C# implementation of the approachusing System; class GFG{         static int maxin = 10001;         // Divisors array to keep track    // of the maximum divisor    static int []divisors = new int[maxin + 1];         // Function to pre-compute the prime    // numbers and largest divisors    static void Calc_Max_Div(int []arr, int n)    {             // Visited array to keep        // track of prime numbers        int []vis = new int[maxin + 1];                 for(int i = 0; i < maxin + 1 ; i++)            vis[i] = 1;         // 0 and 1 are not prime numbers        vis[0] = vis[1] = 0;             // Initialising divisors[i] = i        for (int i = 1; i <= maxin; i++)            divisors[i] = i;             // For all the numbers divisible by 2        // the maximum divisor will be number / 2        for (int i = 4; i <= maxin; i += 2)        {            vis[i] = 0;            divisors[i] = i / 2;        }        for (int i = 3; i <= maxin; i += 2)        {                 // If divisors[i] is not equal to i then            // this means that divisors[i] contains            // minimum prime divisor for the number            if (divisors[i] != i)            {                     // Update the answer to                // i / smallest_prime_divisor[i]                divisors[i] = i / divisors[i];            }                 // Condition if i is a prime number            if (vis[i] == 1)            {                for (int j = i * i; j < maxin; j += i)                {                    vis[j] = 0;                         // If divisors[j] is equal to j then                    // this means that i is the first prime                    // divisor for j so we update divi[j] = i                    if (divisors[j] == j)                        divisors[j] = i;                }            }        }             for (int i = 0; i < n; i++)        {                 // If the current element is prime            // then it has no divisors            // other than 1 and itself            if (divisors[arr[i]] == arr[i])                    Console.Write("-1 ");            else                    Console.Write(divisors[arr[i]] + " ");        }    }         // Driver code    public static void Main()    {        int []arr = { 5, 6, 7, 8, 9, 10 };        int n = arr.Length;             Calc_Max_Div(arr, n);    }} // This code is contributed by AnkitRai01
<script> // Javascript implementation of the approachvar maxin = 100001; // Divisors array to keep track// of the maximum divisorvar divisors = Array(maxin).fill(0); // Function to pre-compute the prime// numbers and largest divisorsfunction Calc_Max_Div(arr, n){     // Visited array to keep    // track of prime numbers    var vis = Array(maxin).fill(1);     // 0 and 1 are not prime numbers    vis[0] = vis[1] = 0;          var i,j;         // Initialising divisors[i] = i    for(i = 1; i <= maxin; i++)        divisors[i] = i;     // For all the numbers divisible by 2    // the maximum divisor will be number / 2    for(i = 4; i <= maxin; i += 2)    {        vis[i] = 0;        divisors[i] = i / 2;    }    for(i = 3; i <= maxin; i += 2)    {                 // If divisors[i] is not equal to i then        // this means that divisors[i] contains        // minimum prime divisor for the number        if (divisors[i] != i)        {                         // Update the answer to            // i / smallest_prime_divisor[i]            divisors[i] = i / divisors[i];        }         // Condition if i is a prime number        if (vis[i] == 1)        {            for(j = i * i; j < maxin; j += i)            {                vis[j] = 0;                 // If divisors[j] is equal to j then                // this means that i is the first prime                // divisor for j so we update divi[j] = i                if (divisors[j] == j)                    divisors[j] = i;            }        }    }     for(i = 0; i < n; i++)    {                 // If the current element is prime        // then it has no divisors        // other than 1 and itself        if (divisors[arr[i]] == arr[i])            document.write("-1 ");        else            document.write(divisors[arr[i]] + " ");    }} // Driver codevar arr = [ 5, 6, 7, 8, 9, 10 ];var n = arr.length; Calc_Max_Div(arr, n); // This code is contributed by bgangwar59 </script>
-1 3 -1 4 3 5
 
Time Complexity: O(N)
Auxiliary Space: O(100001) 
ankthon
bgangwar59
subham348
divisors
Technical Scripter 2019
Arrays
Mathematical
Technical Scripter
Arrays
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Multidimensional Arrays in Java
Stack Data Structure (Introduction and Program)
Linear Search
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays