查找所有整除最大数组元素的数字

原文:https://www.geeksforgeeks.org/find-all-numbers-that-divide-maximum-array-elements/

给定一个由N个数字组成的数组,任务是打印所有大于 1 的数字,这些数字整除数组元素的最大值。

示例

输入a[] = {6, 6, 12, 12, 18, 13}

输出2 3 6

所有数字均整除数组元素的最大值,即 4

输入a[] = {12, 15, 27, 20, 40}

输出2 3 4 5

方法

  • 使用散列存储每个数组元素的所有因数的计数。 我们可以O(sqrt N)找出所有因数。

  • 遍历所有因素,并找到被数字整除的最大数组元素的数量。

  • 再次重新遍历所有因数,并打印出现次数最多的因数。

下面是上述方法的实现。

C++

// C++ program to print all the numbers 
// that divides maximum of array elements 
#include <bits/stdc++.h> 
using namespace std; 

// Function that prints all the numbers 
// which divides maximum of array elements 
void printNumbers(int a[], int n) 
{ 

    // hash to store the number of times 
    // a factor is there 
    unordered_map<int, int> mpp; 

    for (int i = 0; i < n; i++) { 
        int num = a[i]; 

        // find all the factors 
        for (int j = 1; j * j <= num; j++) { 

            // if j is factor of num 
            if (num % j == 0) { 
                if (j != 1) 
                    mpp[j]++; 

                if ((num / j) != j) 
                    mpp[num / j]++; 
            } 
        } 
    } 

    // find the maximum times 
    // it can divide 
    int maxi = 0; 
    for (auto it : mpp) { 
        maxi = max(it.second, maxi); 
    } 

    // print all the factors of 
    // numbers which divides the 
    // maximum array elements 
    for (auto it : mpp) { 
        if (it.second == maxi) 
            cout << it.first << " "; 
    } 
} 

// Driver Code 
int main() 
{ 

    int a[] = { 12, 15, 27, 20, 40 }; 
    int n = sizeof(a) / sizeof(a[0]); 
    printNumbers(a, n); 
} 

Java

// Java program to print all the numbers 
// that divides maximum of array elements 
import java.util.*; 

class GFG 
{ 

// Function that prints all the numbers 
// which divides maximum of array elements 
static void printNumbers(int a[], int n) 
{ 

    // hash to store the number of times 
    // a factor is there 
    Map<Integer,  
        Integer> mpp = new HashMap<>(); 

    for (int i = 0; i < n; i++)  
    { 
        int num = a[i]; 

        // find all the factors 
        for (int j = 1; j * j <= num; j++)  
        { 

            // if j is factor of num 
            if (num % j == 0)  
            { 
                if (j != 1) 
                { 
                    if(mpp.containsKey(j)) 
                    { 
                        mpp.put(j, mpp.get(j) + 1); 
                    } 
                    else
                    { 
                        mpp.put(j, 1); 
                    } 
                } 

                if ((num / j) != j) 
                { 
                    if(mpp.containsKey(num / j)) 
                    { 
                        mpp.put(num / j, mpp.get(num / j) + 1); 
                    } 
                    else
                    { 
                        mpp.put(num / j, 1); 
                    } 
                } 
            } 
        } 
    } 

    // find the maximum times 
    // it can divide 
    int maxi = 0; 
    for (Map.Entry<Integer, 
                   Integer> it : mpp.entrySet()) 
    { 
        maxi = Math.max(it.getValue(), maxi); 
    } 

    // print all the factors of 
    // numbers which divides the 
    // maximum array elements 
    for (Map.Entry<Integer, 
                   Integer> it : mpp.entrySet()) 
    { 
        if (it.getValue() == maxi) 
            System.out.print(it.getKey() + " "); 
    } 
} 

// Driver Code 
public static void main(String[] args)  
{ 
    int a[] = { 12, 15, 27, 20, 40 }; 
    int n = a.length; 
    printNumbers(a, n); 
} 
} 

// This code is contributed by Princi Singh 

Python3

# Python3 program to print all the numbers 
# that divides maximum of array elements 

# Function that prints all the numbers 
# which divides maximum of array elements 
def printNumbers(a, n): 

    # hash to store the number of times 
    # a factor is there 
    mpp = dict() 

    for i in range(n): 
        num = a[i] 

        # find all the factors 
        for j in range(1, num + 1): 

            if j * j > num: 
                break

            # if j is factor of num 
            if (num % j == 0): 
                if (j != 1): 
                    mpp[j]=mpp.get(j, 0) + 1

                if ((num // j) != j): 
                    mpp[num // j]=mpp.get(num//j, 0) + 1

    # find the maximum times 
    # it can divide 
    maxi = 0
    for it in mpp: 
        maxi = max(mpp[it], maxi) 

    # print all the factors of 
    # numbers which divides the 
    # maximum array elements 
    for it in mpp: 
        if (mpp[it] == maxi): 
            print(it,end=" ") 

# Driver Code 
a = [12, 15, 27, 20, 40 ] 
n = len(a) 
printNumbers(a, n) 

# This code is contributed by mohit kumar 

C

// C# program to print all the numbers 
// that divides maximum of array elements 
using System; 
using System.Collections.Generic;  

class GFG 
{ 

// Function that prints all the numbers 
// which divides maximum of array elements 
static void printNumbers(int []a, int n) 
{ 

    // hash to store the number of times 
    // a factor is there 
    Dictionary<int,int> mpp = new Dictionary<int,int>(); 

    for (int i = 0; i < n; i++)  
    { 
        int num = a[i]; 

        // find all the factors 
        for (int j = 1; j * j <= num; j++)  
        { 

            // if j is factor of num 
            if (num % j == 0)  
            { 
                if (j != 1) 
                { 
                    if(mpp.ContainsKey(j)) 
                    { 
                        var v = mpp[j]; 
                        mpp.Remove(j); 
                        mpp.Add(j, v + 1); 
                    } 
                    else
                    { 
                        mpp.Add(j, 1); 
                    } 
                } 

                if ((num / j) != j) 
                { 
                    if(mpp.ContainsKey(num / j)) 
                    { 
                        var v = mpp[num/j]; 
                        mpp.Remove(num/j); 
                        mpp.Add(num / j, v + 1); 
                    } 
                    else
                    { 
                        mpp.Add(num / j, 1); 
                    } 
                } 
            } 
        } 
    } 

    // find the maximum times 
    // it can divide 
    int maxi = 0; 
    foreach(KeyValuePair<int, int> it in mpp) 
    { 
        maxi = Math.Max(it.Value, maxi); 
    } 

    // print all the factors of 
    // numbers which divides the 
    // maximum array elements 
    foreach(KeyValuePair<int, int> it in mpp) 
    { 
        if (it.Value == maxi) 
            Console.Write(it.Key + " "); 
    } 
} 

// Driver Code 
public static void Main(String[] args)  
{ 
    int []a = { 12, 15, 27, 20, 40 }; 
    int n = a.Length; 
    printNumbers(a, n); 
} 
} 

// This code is contributed by 29AjayKumar 

输出

5 2 3 4

时间复杂度O(N * sqrt(max(arr)))