Related Articles
Find an integer X which is divisor of all except exactly one element in an array
• Difficulty Level : Medium
• Last Updated : 27 Apr, 2021

Given an array of integers. Find an integer X which is the divisor of all except for exactly one element in the given array.
Note: The GCD of all the elements is not 1.

Examples:

```Input : arr[] = {6, 18, 3, 12}
Output : 6
6 is the divisor of all except 3.

Input : arr[] = {40, 15, 30, 42}
Output : 3
3 is the divisor of all except 40. ```

Approach: Make a prefix array P such that index i contains the GCD of all the elements from 1 to i. Similarly, make a suffix array S such that index i contains the GCD of all the elements from i to n-1 (last index). If the GCD of P[i-1] and S[i+1] is not the divisor of the element at i, then it is the required answer.
Below is the implementation of the above approach:

C++

 `// C++ program to find the  divisor  of all``// except for exactly one element in an array.` `#include ``using` `namespace` `std;` `// Function that returns the  divisor  of all``// except for exactly one element in an array.``int` `getDivisor(``int` `a[], ``int` `n)``{``    ``// There's only one element in the array``    ``if` `(n == 1)``        ``return` `(a[0] + 1);` `    ``int` `P[n], S[n];` `    ``// Creating prefix array of GCD``    ``P[0] = a[0];``    ``for` `(``int` `i = 1; i < n; i++)``         ``P[i] = __gcd(a[i], P[i - 1]);   ` `    ``// Creating suffix array of GCD``    ``S[n-1] = a[n-1];``    ``for` `(``int` `i = n - 2; i >= 0; i--)``         ``S[i] = __gcd(S[i + 1], a[i]);   ` `    ``// Iterate through the array``    ``for` `(``int` `i = 0; i <= n; i++) {` `        ``// Variable to store the divisor``        ``int` `cur;` `        ``// Getting the divisor``        ``if` `(i == 0)``            ``cur = S[i + 1];``        ``else` `if` `(i == n - 1)``            ``cur = P[i - 1];``        ``else``            ``cur = __gcd(P[i - 1], S[i + 1]);` `        ``// Check if it is not a divisor of a[i]``        ``if` `(a[i] % cur != 0)``            ``return` `cur;``    ``}` `    ``return` `0;``}` `// Driver code``int` `main()``{``    ``int` `a[] = { 12, 6, 18, 12, 16 };` `    ``int` `n = ``sizeof``(a) / ``sizeof``(a[0]);` `    ``cout << getDivisor(a, n);` `    ``return` `0;``}`

Java

 `// Java  program to find the divisor of all``// except for exactly one element in an array.``import` `java.io.*;` `class` `GFG {``    ` `// Recursive function to return gcd of a and b``    ``static` `int` `__gcd(``int` `a, ``int` `b)``    ``{``        ``// Everything divides 0 ``        ``if` `(a == ``0``)``          ``return` `b;``        ``if` `(b == ``0``)``          ``return` `a;``       ` `        ``// base case``        ``if` `(a == b)``            ``return` `a;``       ` `        ``// a is greater``        ``if` `(a > b)``            ``return` `__gcd(a-b, b);``        ``return` `__gcd(a, b-a);``    ``}``// Function that returns the divisor of all``// except for exactly one element in an array.``static` `int` `getDivisor(``int` `a[], ``int` `n)``{``    ``// There's only one element in the array``    ``if` `(n == ``1``)``        ``return` `(a[``0``] + ``1``);` `    ``int` `P[] = ``new` `int``[n];``    ``int`    `S[] = ``new` `int``[n];` `    ``// Creating prefix array of GCD``    ``P[``0``] = a[``0``];``    ``for` `(``int` `i = ``1``; i < n; i++)``        ``P[i] = __gcd(a[i], P[i - ``1``]);` `    ``// Creating suffix array of GCD``    ``S[n-``1``] = a[n-``1``];``    ``for` `(``int` `i = n - ``2``; i >= ``0``; i--)``        ``S[i] = __gcd(S[i + ``1``], a[i]);` `    ``// Iterate through the array``    ``for` `(``int` `i = ``0``; i < n; i++) {` `        ``// Variable to store the divisor``        ``int` `cur;` `        ``// Getting the divisor``        ``if` `(i == ``0``)``            ``cur = S[i + ``1``];``        ``else` `if` `(i == n - ``1``)``            ``cur = P[i - ``1``];``        ``else``            ``cur = __gcd(P[i - ``1``], S[i + ``1``]);` `        ``// Check if it is not a divisor of a[i]``        ``if` `(a[i] % cur != ``0``)``            ``return` `cur;``    ``}` `    ``return` `0``;``}` `// Driver code`  `    ``public` `static` `void` `main (String[] args) {``            ``int` `a[] = { ``12``, ``6``, ``18``, ``12``, ``16` `};` `    ``int` `n = a.length;` `    ``System.out.println(getDivisor(a, n));``    ``}``}``// This code is contributed by anuj_67..`

Python 3

 `# Python 3 program to find the divisor of all``# except for exactly one element in an array.``from` `math ``import` `gcd` `# Function to find the divisor of all``# except for exactly one element in an array.``def` `getDivisor(a, n):``    ` `    ``# There's only one element in the array``    ``if` `(n ``=``=` `1``):``        ``return` `(a[``0``] ``+` `1``)` `    ``P ``=` `[``0``] ``*` `n``    ``S ``=` `[``0``] ``*` `n` `    ``# Creating prefix array of GCD``    ``P[``0``] ``=` `a[``0``]``    ``for` `i ``in` `range``(``1``, n):``        ``P[i] ``=` `gcd(a[i], P[i ``-` `1``])` `    ``# Creating suffix array of GCD``    ``S[n ``-` `1``] ``=` `a[n ``-` `1``]``    ``for` `i ``in` `range``(n ``-` `2``, ``-``1``, ``-``1``):``        ``S[i] ``=` `gcd(S[i ``+` `1``], a[i])` `    ``# Iterate through the array``    ``for` `i ``in` `range``(``0``, n ``+` `1``):` `        ``# Variable to store the divisor``        ``cur ``=` `0` `        ``# Getting the divisor``        ``if` `(i ``=``=` `0``):``            ``cur ``=` `S[i ``+` `1``]``        ``elif` `(i ``=``=` `n ``-` `1``):``            ``cur ``=` `P[i ``-` `1``]``        ``else``:``            ``cur ``=` `gcd(P[i ``-` `1``], S[i ``+` `1``])` `        ``# Check if it is not a divisor of a[i]``        ``if` `(a[i] ``%` `cur !``=` `0``):``            ``return` `cur` `    ``return` `0``;` `# Driver Code``if` `__name__``=``=``'__main__'``:``    ``a ``=` `[``12``, ``6``, ``18``, ``12``, ``16``]``    ``n ``=` `len``(a)``    ` `    ``print``(getDivisor(a, n))``    ` `# This code is contributed by Rupesh Rao`

C#

 `// C# program to find the divisor of all``// except for exactly one element in an array.``using` `System;` `class` `GFG``{``    ` `// Recursive function to return gcd of a and b``static` `int` `__gcd(``int` `a, ``int` `b)``{``    ``// Everything divides 0``    ``if` `(a == 0)``        ``return` `b;``    ``if` `(b == 0)``        ``return` `a;``    ` `    ``// base case``    ``if` `(a == b)``        ``return` `a;``    ` `    ``// a is greater``    ``if` `(a > b)``        ``return` `__gcd(a - b, b);``    ``return` `__gcd(a, b - a);``}` `// Function that returns the divisor of all``// except for exactly one element in an array.``static` `int` `getDivisor(``int``[] a, ``int` `n)``{``    ` `    ``// There's only one element in the array``    ``if` `(n == 1)``        ``return` `(a[0] + 1);``    ` `    ``int``[] P = ``new` `int``[n];``    ``int``[] S = ``new` `int``[n];``    ` `    ``// Creating prefix array of GCD``    ``P[0] = a[0];``    ``for` `(``int` `i = 1; i < n; i++)``        ``P[i] = __gcd(a[i], P[i - 1]);``    ` `    ``// Creating suffix array of GCD``    ``S[n - 1] = a[n - 1];``    ``for` `(``int` `i = n - 2; i >= 0; i--)``        ``S[i] = __gcd(S[i + 1], a[i]);``    ` `    ``// Iterate through the array``    ``for` `(``int` `i = 0; i <= n; i++)``    ``{``    ` `        ``// Variable to store the divisor``        ``int` `cur;``    ` `        ``// Getting the divisor``        ``if` `(i == 0)``            ``cur = S[i + 1];``        ``else` `if` `(i == n - 1)``            ``cur = P[i - 1];``        ``else``            ``cur = __gcd(P[i - 1], S[i + 1]);``    ` `        ``// Check if it is not a divisor of a[i]``        ``if` `(a[i] % cur != 0)``            ``return` `cur;``    ``}``    ` `    ``return` `0;``}` `// Driver code``public` `static` `void` `Main ()``{``    ``int``[] a = { 12, 6, 18, 12, 16 };` `    ``int` `n = a.Length;``    ` `    ``Console.WriteLine(getDivisor(a, n));``}``}` `// This code is contributed``// by Akanksha Rai`

PHP

 ` ``\$b``)``        ``return` `__gcd(``\$a` `- ``\$b``, ``\$b``);``        ` `    ``return` `__gcd(``\$a``, ``\$b` `- ``\$a``);``}` `// Function that returns the divisor of all``// except for exactly one element in an array.``function` `getDivisor(``\$a``, ``\$n``)``{``    ``// There's only one element in the array``    ``if` `(``\$n` `== 1)``        ``return` `(``\$a``[0] + 1);` `    ``\$P` `= ``array``() ;``    ``\$S` `= ``array``() ;` `    ``// Creating prefix array of GCD``    ``\$P``[0] = ``\$a``[0];``    ` `    ``for` `(``\$i` `= 1; ``\$i` `< ``\$n``; ``\$i``++)``        ``\$P``[``\$i``] = __gcd(``\$a``[``\$i``], ``\$P``[``\$i` `- 1]);` `    ``// Creating suffix array of GCD``    ``\$S``[``\$n` `- 1] = ``\$a``[``\$n` `- 1];``    ``for` `(``\$i` `= ``\$n` `- 2; ``\$i` `>= 0; ``\$i``--)``        ``\$S``[``\$i``] = __gcd(``\$S``[``\$i` `+ 1], ``\$a``[``\$i``]);` `    ``// Iterate through the array``    ``for` `(``\$i` `= 0; ``\$i` `<= ``\$n``; ``\$i``++)``    ``{` `        ``// Getting the divisor``        ``if` `(``\$i` `== 0)``            ``\$cur` `= ``\$S``[``\$i` `+ 1];``        ``else` `if` `(``\$i` `== ``\$n` `- 1)``            ``\$cur` `= ``\$P``[``\$i` `- 1];``        ``else``            ``\$cur` `= __gcd(``\$P``[``\$i` `- 1], ``\$S``[``\$i` `+ 1]);` `        ``// Check if it is not a divisor of a[i]``        ``if` `(``\$a``[``\$i``] % ``\$cur` `!= 0)``            ``return` `\$cur``;``    ``}` `    ``return` `0;``}` `// Driver code``\$a` `= ``array``( 12, 6, 18, 12, 16 );` `\$n` `= sizeof(``\$a``);` `echo` `getDivisor(``\$a``, ``\$n``);` `// This code is contributed by Ryuga``?>`

Javascript

 ``
Output:
`6`

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.  Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live and Geeks Classes Live USA

My Personal Notes arrow_drop_up