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

📅  最后修改于: 2021-09-17 07:33:59             🧑  作者: Mango

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

例子:

方法:

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

下面是上述方法的实现:

C++14
// 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


Javascript


输出:
3

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程