# Maximum GCD of all subarrays of length at least 2

Given an array arr[] of N numbers. The task is to find the maximum GCD of all subarrays of size greater than 1.

Examples:

Input: arr[] = { 3, 18, 9, 9, 5, 15, 8, 7, 6, 9 }
Output: 9
Explanation:
GCD of the subarray {18, 9, 9} is maximum which is 9.

Input: arr[] = { 4, 8, 12, 16, 20, 24 }
Output: 4
Explanation:
GCD of the subarray {4, 18, 12, 16, 20, 24} is maximum which is 4.

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Naive Approach: The idea is to generate all the subarray of size greater than 1 and then find the maximum of gcd of all subarray formed.
Time complexity: O(N2)

Efficient Approach: Let GCD of two numbers be g. Now if we take gcd of g with any third number say c then, gcd will decrease or remain same, but it will never increase.
The idea is to find gcd of every consecutive pair in the arr[] and the maximum of gcd of all the pairs formed is the desired result.

Below is the implementation of the above approach:

 // C++ program for the above approach    #include using namespace std;    // Function to find GCD int gcd(int a, int b) {     if (b == 0) {         return a;     }     return gcd(b, a % b); }    void findMaxGCD(int arr[], int n) {        // To store the maximum GCD     int maxGCD = 0;        // Traverse the array     for (int i = 0; i < n - 1; i++) {            // Find GCD of the consecutive         // element         int val = gcd(arr[i], arr[i + 1]);            // If calculated GCD > maxGCD         // then update it         if (val > maxGCD) {             maxGCD = val;         }     }        // Print the maximum GCD     cout << maxGCD << endl; }    // Driver Code int main() {     int arr[] = { 3, 18, 9, 9, 5,                   15, 8, 7, 6, 9 };        int n = sizeof(arr) / sizeof(arr[0]);        // Function Call     findMaxGCD(arr, n);     return 0; }

 // Java program for the above approach import java.util.*;    class GFG{    // Function to find GCD static int gcd(int a, int b) {     if (b == 0)     {         return a;     }     return gcd(b, a % b); }    static void findMaxGCD(int arr[], int n) {        // To store the maximum GCD     int maxGCD = 0;        // Traverse the array     for(int i = 0; i < n - 1; i++)      {                   // Find GCD of the consecutive        // element        int val = gcd(arr[i], arr[i + 1]);                  // If calculated GCD > maxGCD        // then update it        if (val > maxGCD)        {            maxGCD = val;        }     }        // Print the maximum GCD     System.out.print(maxGCD + "\n"); }    // Driver Code public static void main(String[] args) {     int arr[] = { 3, 18, 9, 9, 5,                   15, 8, 7, 6, 9 };     int n = arr.length;        // Function call     findMaxGCD(arr, n); } }    // This code is contributed by amal kumar choubey

 # Python3 program for the above approach    # Function to find GCD def gcd(a, b):            if (b == 0):         return a;     return gcd(b, a % b);    def findMaxGCD(arr, n):            # To store the maximum GCD     maxGCD = 0;        # Traverse the array     for i in range(0, n - 1):            # Find GCD of the consecutive         # element         val = gcd(arr[i], arr[i + 1]);            # If calculated GCD > maxGCD         # then update it         if (val > maxGCD):             maxGCD = val;        # Print the maximum GCD     print(maxGCD);    # Driver Code if __name__ == '__main__':            arr = [ 3, 18, 9, 9, 5,              15, 8, 7, 6, 9 ];     n = len(arr);        # Function call     findMaxGCD(arr, n);    # This code is contributed by 29AjayKumar

 // C# program for the above approach using System;    class GFG{    // Function to find GCD static int gcd(int a, int b) {     if (b == 0)     {         return a;     }     return gcd(b, a % b); }    static void findMaxGCD(int []arr, int n) {        // To store the maximum GCD     int maxGCD = 0;        // Traverse the array     for(int i = 0; i < n - 1; i++)      {                    // Find GCD of the consecutive         // element         int val = gcd(arr[i], arr[i + 1]);                        // If calculated GCD > maxGCD         // then update it         if (val > maxGCD)         {             maxGCD = val;         }     }        // Print the maximum GCD     Console.Write(maxGCD + "\n"); }    // Driver Code public static void Main() {     int []arr = { 3, 18, 9, 9, 5,                  15, 8, 7, 6, 9 };     int n = arr.Length;        // Function call     findMaxGCD(arr, n); } }    // This code is contributed by Code_Mech

Output:
9

Time Complexity: O(N), where N is the length of the array.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

Article Tags :
Practice Tags :