Find a number that divides maximum array elements - GeeksforGeeks

31 May, 2021
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.  
 
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 elements 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++
Java
Python3
C#
Javascript
// CPP program to find a number that// divides maximum array elements #include <bits/stdc++.h>using namespace std; #define MAXN 100001 // stores smallest prime factor for every numberint spf[MAXN]; // Calculating SPF (Smallest Prime Factor) for every// number till MAXN.// Time Complexity : O(nloglogn)void sieve(){    spf[1] = 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 stepvector<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 elementsint 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 programint main(){    int A[] = { 2, 5, 10 };    int n = sizeof(A) / sizeof(A[0]);     cout << maxElement(A, n);     return 0;}
// Java program to find a number that// divides maximum array elementsimport java.util.*;class Solution{static final int MAXN=100001;   // stores smallest prime factor for every numberstatic int spf[]= new int[MAXN];   // Calculating SPF (Smallest Prime Factor) for every// number till MAXN.// Time Complexity : O(nloglogn)static void sieve(){    spf[1] = 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 stepstatic Vector<Integer> getFactorization(int x){    Vector<Integer> ret= new Vector<Integer>();    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 elementsstatic int maxElement(int A[], int n){    // precalculating Smallest Prime Factor    sieve();       // Hash to store frequency of each divisors    Map<Integer, Integer> m= new HashMap<Integer, Integer>();       // Traverse the array and get spf of each element    for (int j = 0; j < n; ++j) {           // calling getFactorization function        Vector<Integer> 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 programpublic 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 program to find a number that# divides maximum array elementsimport math as mt MAXN = 100001 # stores smallest prime factor for# every numberspf = [0 for i in range(MAXN)] # Calculating SPF (Smallest Prime Factor)# for every number till MAXN.# Time Complexity : O(nloglogn)def sieve():     spf[1] = 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 stepdef 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 elementsdef 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 CodeA = [2, 5, 10 ]n = len(A) print(maxElement(A, n)) # This code is contributed by Mohit kumar 29
     // C# program to find a number that// divides maximum array elementsusing System;using System.Collections.Generic; class Solution{     static readonly int MAXN = 100001;     // stores smallest prime factor for every numberstatic int []spf = new int[MAXN];     // Calculating SPF (Smallest Prime Factor) for every// number till MAXN.// Time Complexity : O(nloglogn)static void sieve(){    spf[1] = 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 stepstatic List<int> getFactorization(int x){    List<int> ret= new List<int>();    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 elementsstatic int maxElement(int []A, int n){    // precalculating Smallest Prime Factor    sieve();         // Hash to store frequency of each divisors    Dictionary<int, int> m= new Dictionary<int, int>();         // Traverse the array and get spf of each element    for (int j = 0; j < n; ++j)    {             // calling getFactorization function        List<int> p = getFactorization(A[j]);             for (int i = 0; i < p.Count; i++)            if(m.ContainsKey(p[i]))            m[p[i]] = m[p[i]] + 1;            else                m.Add(p[i], 1);    }         int cnt = 0, ans = 10000000;         // Returns Set view        foreach(KeyValuePair<int, int> me in m)    {        if (me.Value >= cnt)        {            cnt = me.Value;            if(ans > me.Key)                ans = me.Key ;            else                ans = ans;        }    }         return ans;}     // Driver programpublic static void Main(String []args){    int []A = { 2, 5, 10 };    int n =A.Length;         Console.Write(maxElement(A, n));}} // This code is contributed by 29AjayKumar
<script> // JavaScript program to find a number that// divides maximum array elements let MAXN=100001; // stores smallest prime factor for every numberlet spf= new Array(MAXN);for(let i=0;i<MAXN;i++){    spf[i]=0;} // Calculating SPF (Smallest Prime Factor) for every// number till MAXN.// Time Complexity : O(nloglogn)function sieve(){    spf[1] = 1;    for (let 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 (let i = 4; i < MAXN; i += 2)        spf[i] = 2;         for (let i = 3; i * i < MAXN; i++) {        // checking if i is prime        if (spf[i] == i) {            // marking SPF for all numbers divisible by i            for (let 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 stepfunction getFactorization(x){    let ret= [];    while (x != 1) {        let temp = spf[x];        ret.push(temp);        while (x % temp == 0)            x = Math.floor(x / temp);    }    return ret;} // Function to find a number that// divides maximum array elementsfunction maxElement(A,n){    // precalculating Smallest Prime Factor    sieve();         // Hash to store frequency of each divisors    let m= new Map();         // Traverse the array and get spf of each element    for (let j = 0; j < n; ++j) {             // calling getFactorization function        let p = getFactorization(A[j]);             for (let i = 0; i < p.length; i++)            m.set(p[i],m.get(p[i])==null?0:m.get(p[i])+1);    }         let cnt = 0, ans = 10000000;    // Returns Set view                            for (let [key, value] of m.entries())       {        if (value >= cnt) {            cnt = value;            if(ans > key)                ans = key ;            else                ans = ans;        }    }         return ans;} // Driver programlet A=[ 2, 5, 10];let n =A.length;document.write(maxElement(A, n));       // This code is contributed by patel2127 </script>
2
 
Time Complexity: O(N*log(N)) 
andrew1234
mohit kumar 29
29AjayKumar
patel2127
frequency-counting
prime-factor
sieve
Arrays
Mathematical
Arrays
Mathematical
sieve
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
Introduction to Arrays
Multidimensional Arrays in Java
Linear Search
Linked List vs Array
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7