# Find a number that divides maximum array elements

Given an array A[] of N non-negative integers. Find an Integer greater than 1, such that maximum array elements are divisible by it. In case of same answer print the smaller one.

Examples:

Input : A[] = { 2, 4, 5, 10, 8, 15, 16 };
Output : 2
Explanation: 2 divides [ 2, 4, 10, 8, 16] no other element divides greater than 5 numbers.

Input : A[] = { 2, 5, 10 }
Output : 2
Explanation: 2 divides [2, 10] and 5 divides [5, 10], but 2 is smaller.

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

Naive Approach: Run a for loop upto maximum element of the array. Let it be K. Iterate the array and divide each element of the array by all numbers . Update the result according the maximum number of elements got divided by the element i.

Efficient Approach: We know that a number can be divisible only by elements which can be formed by their prime factors.
Thus we find the prime factors of all element of the array and store their frequency in the hash. Finally we return the element with maximum frequency among them.

You can use factorization-using-sieve to find prime factors in Log(n).

Below is the implementation of above approach:

## C++

 // CPP program to find a number that  // divides maximum array elements     #include  using namespace std;     #define MAXN 100001     // stores smallest prime factor for every number  int spf[MAXN];     // Calculating SPF (Smallest Prime Factor) for every  // number till MAXN.  // Time Complexity : O(nloglogn)  void sieve()  {      spf = 1;      for (int i = 2; i < MAXN; i++)             // marking smallest prime factor for every          // number to be itself.          spf[i] = i;         // separately marking spf for every even      // number as 2      for (int i = 4; i < MAXN; i += 2)          spf[i] = 2;         for (int i = 3; i * i < MAXN; i++) {          // checking if i is prime          if (spf[i] == i) {              // marking SPF for all numbers divisible by i              for (int j = i * i; j < MAXN; j += i)                     // marking spf[j] if it is not                  // previously marked                  if (spf[j] == j)                      spf[j] = i;          }      }  }     // A O(log n) function returning primefactorization  // by dividing by smallest prime factor at every step  vector<int> getFactorization(int x)  {      vector<int> ret;      while (x != 1) {          int temp = spf[x];          ret.push_back(temp);          while (x % temp == 0)              x = x / temp;      }      return ret;  }     // Function to find a number that  // divides maximum array elements  int maxElement(int A[], int n)  {      // precalculating Smallest Prime Factor      sieve();         // Hash to store frequency of each divisors      map<int, int> m;         // Traverse the array and get spf of each element      for (int i = 0; i < n; ++i) {             // calling getFactorization function          vector<int> p = getFactorization(A[i]);             for (int i = 0; i < p.size(); i++)              m[p[i]]++;      }         int cnt = 0, ans = 1e+7;         for (auto i : m) {          if (i.second >= cnt) {              cnt = i.second;              ans > i.first ? ans = i.first : ans = ans;          }      }         return ans;  }     // Driver program  int main()  {      int A[] = { 2, 5, 10 };      int n = sizeof(A) / sizeof(A);         cout << maxElement(A, n);         return 0;  }

## Java

 // Java program to find a number that   // divides maximum array elements   import java.util.*;  class Solution  {  static final int MAXN=100001;        // stores smallest prime factor for every number   static int spf[]= new int[MAXN];        // Calculating SPF (Smallest Prime Factor) for every   // number till MAXN.   // Time Complexity : O(nloglogn)   static void sieve()   {       spf = 1;       for (int i = 2; i < MAXN; i++)                // marking smallest prime factor for every           // number to be itself.           spf[i] = i;            // separately marking spf for every even       // number as 2       for (int i = 4; i < MAXN; i += 2)           spf[i] = 2;            for (int i = 3; i * i < MAXN; i++) {           // checking if i is prime           if (spf[i] == i) {               // marking SPF for all numbers divisible by i               for (int j = i * i; j < MAXN; j += i)                        // marking spf[j] if it is not                   // previously marked                   if (spf[j] == j)                       spf[j] = i;           }       }   }        // A O(log n) function returning primefactorization   // by dividing by smallest prime factor at every step   static Vector getFactorization(int x)   {       Vector ret= new Vector();       while (x != 1) {           int temp = spf[x];           ret.add(temp);           while (x % temp == 0)               x = x / temp;       }       return ret;   }        // Function to find a number that   // divides maximum array elements   static int maxElement(int A[], int n)   {       // precalculating Smallest Prime Factor       sieve();            // Hash to store frequency of each divisors       Map m= new HashMap();            // Traverse the array and get spf of each element       for (int j = 0; j < n; ++j) {                // calling getFactorization function           Vector p = getFactorization(A[j]);                for (int i = 0; i < p.size(); i++)               m.put(p.get(i),m.get(p.get(i))==null?0:m.get(p.get(i))+1);       }            int cnt = 0, ans = 10000000;       // Returns Set view               Set< Map.Entry< Integer,Integer> > st = m.entrySet();                  for (Map.Entry< Integer,Integer> me:st)          {           if (me.getValue() >= cnt) {               cnt = me.getValue();               if(ans > me.getKey())               ans = me.getKey() ;              else             ans = ans;           }       }            return ans;   }        // Driver program   public static void main(String args[])  {       int A[] = { 2, 5, 10 };       int n =A.length;            System.out.print(maxElement(A, n));           }   }  //contributed by Arnab Kundu

## Python3

 # Python3 program to find a number that   # divides maximum array elements  import math as mt     MAXN = 100001    # stores smallest prime factor for   # every number  spf = [0 for i in range(MAXN)]     # Calculating SPF (Smallest Prime Factor)   # for every number till MAXN.  # Time Complexity : O(nloglogn)  def sieve():         spf = 1     for i in range(2, MAXN):             # marking smallest prime factor for           # every number to be itself.          spf[i] = i         # separately marking spf for every       # even number as 2      for i in range(4, MAXN, 2):          spf[i] = 2        for i in range(3, mt.ceil(mt.sqrt(MAXN + 1))):                     # checking if i is prime          if (spf[i] == i):                              # marking SPF for all numbers divisible by i              for j in range(2 * i, MAXN, i):                     # marking spf[j] if it is not                  # previously marked                  if (spf[j] == j):                      spf[j] = i             # A O(log n) function returning primefactorization  # by dividing by smallest prime factor at every step  def getFactorization (x):         ret = list()      while (x != 1):           temp = spf[x]          ret.append(temp)          while (x % temp == 0):              x = x //temp             return ret     # Function to find a number that  # divides maximum array elements  def maxElement (A, n):         # precalculating Smallest Prime Factor      sieve()         # Hash to store frequency of each divisors      m = dict()         # Traverse the array and get spf of each element      for i in range(n):              # calling getFactorization function          p = getFactorization(A[i])             for i in range(len(p)):              if p[i] in m.keys():                  m[p[i]] += 1             else:                  m[p[i]] = 1        cnt = 0     ans = 10**9+7        for i in m:           if (m[i] >= cnt):              cnt = m[i]              if ans > i:                  ans = i              else:                  ans = ans         return ans     # Driver Code  A = [2, 5, 10 ]  n = len(A)     print(maxElement(A, n))     # This code is contributed by Mohit kumar 29

Output:

2


Time Complexity: O(N*log(N))

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : andrew1234, mohit kumar 29

Article Tags :
Practice Tags :

2

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.