📜  数组中任何元素之前的最大倍数

📅  最后修改于: 2021-04-29 15:12:11             🧑  作者: Mango

给定一个数组arr [] ,任务是找到索引j 的最大数量,以使所有数组元素中的(arr [j]%arr [i])= 0

例子:

方法:

  1. 使用映射存储每个数组元素的所有除数。
  2. 使用本文讨论的方法,以sqrt(n)时间生成元素的所有除数。
  3. 现在,为每个元素获取所有已存储的除数中的最大值并进行更新。

下面是上述方法的实现:

CPP
// C++ implementation of the approach
  
#include 
using namespace std;
  
const int MAX = 100000;
  
// Map to store the divisor count
int divisors[MAX];
  
// Function to generate the divisors
// of all the array elements
int generateDivisors(int n)
{
    for (int i = 1; i <= sqrt(n); i++) {
        if (n % i == 0) {
            if (n / i == i) {
                divisors[i]++;
            }
            else {
                divisors[i]++;
                divisors[n / i]++;
            }
        }
    }
}
  
// Function to find the maximum number
// of multiples in an array before it
int findMaxMultiples(int* arr, int n)
{
    // To store the maximum divisor count
    int ans = 0;
  
    for (int i = 0; i < n; i++) {
  
        // Update ans if more number
        // of divisors are found
        ans = max(divisors[arr[i]], ans);
  
        // Generating all the divisors of
        // the next element of the array
        generateDivisors(arr[i]);
    }
    return ans;
}
  
// Driver code
int main()
{
    int arr[] = { 8, 1, 28, 4, 2, 6, 7 };
    int n = sizeof(arr) / sizeof(int);
  
    cout << findMaxMultiples(arr, n);
  
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
  
class GFG
{
  
static int MAX = 100000;
  
// Map to store the divisor count
static int []divisors = new int[MAX];
  
// Function to generate the divisors
// of all the array elements
static void generateDivisors(int n)
{
    for (int i = 1; i <= Math.sqrt(n); i++) 
    {
        if (n % i == 0) 
        {
            if (n / i == i)
            {
                divisors[i]++;
            }
            else 
            {
                divisors[i]++;
                divisors[n / i]++;
            }
        }
    }
}
  
// Function to find the maximum number
// of multiples in an array before it
static int findMaxMultiples(int []arr, int n)
{
    // To store the maximum divisor count
    int ans = 0;
  
    for (int i = 0; i < n; i++)
    {
  
        // Update ans if more number
        // of divisors are found
        ans = Math.max(divisors[arr[i]], ans);
  
        // Generating all the divisors of
        // the next element of the array
        generateDivisors(arr[i]);
    }
    return ans;
}
  
// Driver code
public static void main(String[] args)
{
    int arr[] = { 8, 1, 28, 4, 2, 6, 7 };
    int n = arr.length;
  
    System.out.print(findMaxMultiples(arr, n));
}
}
  
// This code is contributed by PrinciRaj1992


Python3
# Python3 implementation of the approach
from math import ceil,sqrt
MAX = 100000
  
# Map to store the divisor count
divisors = [0] * MAX
  
# Function to generate the divisors
# of all the array elements
def generateDivisors(n):
    for i in range(1,ceil(sqrt(n)) + 1):
        if (n % i == 0):
            if (n // i == i):
                divisors[i]+=1
            else:
                divisors[i] += 1
                divisors[n // i] += 1
  
# Function to find the maximum number
# of multiples in an array before it
def findMaxMultiples(arr, n):
      
    # To store the maximum divisor count
    ans = 0
    for i in range(n):
  
        # Update ans if more number
        # of divisors are found
        ans = max(divisors[arr[i]], ans)
  
        # Generating all the divisors of
        # the next element of the array
        generateDivisors(arr[i])
    return ans
  
# Driver code
arr = [8, 1, 28, 4, 2, 6, 7]
n = len(arr)
  
print(findMaxMultiples(arr, n))
  
# This code is contributed by mohit kumar 29


C#
// C# implementation of the approach
using System;
  
class GFG
{
  
static int MAX = 100000;
  
// Map to store the divisor count
static int []divisors = new int[MAX];
  
// Function to generate the divisors
// of all the array elements
static void generateDivisors(int n)
{
    for (int i = 1; i <= Math.Sqrt(n); i++) 
    {
        if (n % i == 0) 
        {
            if (n / i == i)
            {
                divisors[i]++;
            }
            else
            {
                divisors[i]++;
                divisors[n / i]++;
            }
        }
    }
}
  
// Function to find the maximum number
// of multiples in an array before it
static int findMaxMultiples(int []arr, int n)
{
    // To store the maximum divisor count
    int ans = 0;
  
    for (int i = 0; i < n; i++)
    {
  
        // Update ans if more number
        // of divisors are found
        ans = Math.Max(divisors[arr[i]], ans);
  
        // Generating all the divisors of
        // the next element of the array
        generateDivisors(arr[i]);
    }
    return ans;
}
  
// Driver code
public static void Main(String[] args)
{
    int []arr = { 8, 1, 28, 4, 2, 6, 7 };
    int n = arr.Length;
  
    Console.Write(findMaxMultiples(arr, n));
}
}
  
// This code is contributed by 29AjayKumar


输出:
3