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

📅  最后修改于: 2021-10-27 07:42:28             🧑  作者: Mango

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

方法:

  • 使用散列来存储每个数组元素的所有因子的计数。我们可以在 O(sqrt N) 中找到数字的所有因子。
  • 遍历所有因子,并找到被数字除的最大数组元素的计数。
  • 再次重新遍历所有因子并打印出现次数最多的因子。

下面是上述方法的实现。

C++
// C++ program to print all the numbers
// that divides maximum of array elements
#include 
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 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 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 it : mpp.entrySet())
    {
        maxi = Math.max(it.getValue(), maxi);
    }
 
    // print all the factors of
    // numbers which divides the
    // maximum array elements
    for (Map.Entry 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 mpp = new Dictionary();
 
    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 it in mpp)
    {
        maxi = Math.Max(it.Value, maxi);
    }
 
    // print all the factors of
    // numbers which divides the
    // maximum array elements
    foreach(KeyValuePair 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


Javascript


输出:
5 2 3 4

时间复杂度: O(N * sqrt(max(array element)))