Largest K digit number divisible by all numbers in given array
Last Updated :
15 Dec, 2021
Given an array arr[] of size N and an integer K. The task is to find the largest K digit number divisible by all number of arr[].
Examples:
Input: arr[] = {2, 3, 5}, K = 3
Output: 990
Explanation: 990 is the largest 3 digit number divisible by 2, 3 and 5.
Input: arr[] = {91, 93, 95}, K = 3
Output: -1
Explanation: There is no 3 digit number divisible by all 91, 93 and 95.
Approach: The solution is based on the idea similar to finding largest K digit number divisible by X. Follow the steps mentioned below.
LCM(arr) * ((10K-1)/LCM(arr))
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int __gcd( int a, int b)
{
if (a == 0)
return b;
if (b == 0)
return a;
if (a == b)
return a;
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
int findLCM( int arr[], int n, int idx)
{
if (idx == n - 1)
{
return arr[idx];
}
int a = arr[idx];
int b = findLCM(arr, n, idx + 1);
double gcd = __gcd(a, b);
return (a * ( int ) floor (b / gcd));
}
int findNum( int arr[], int n, int K)
{
int lcm = findLCM(arr, n, 0);
int ans = ( int ) floor (( pow (10, K) - 1) / lcm);
ans = (ans) * lcm;
if (ans == 0)
return -1;
return ans;
}
int main()
{
int arr[] = { 2, 3, 5 };
int n = sizeof (arr) / sizeof (arr[0]);
int K = 3;
cout << findNum(arr, n, K);
}
|
Java
class GFG
{
static int __gcd( int a, int b)
{
if (a == 0 )
return b;
if (b == 0 )
return a;
if (a == b)
return a;
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
static int findLCM( int []arr, int idx)
{
if (idx == arr.length - 1 )
{
return arr[idx];
}
int a = arr[idx];
int b = findLCM(arr, idx + 1 );
double gcd = __gcd(a, b);
return (a * ( int )Math.floor(b / gcd));
}
static int findNum( int []arr, int K)
{
int lcm = findLCM(arr, 0 );
int ans = ( int )Math.floor((Math.pow( 10 , K) - 1 ) / lcm);
ans = (ans) * lcm;
if (ans == 0 )
return - 1 ;
return ans;
}
public static void main(String []args)
{
int []arr = { 2 , 3 , 5 };
int K = 3 ;
System.out.println(findNum(arr, K));
}
}
|
Python3
import math
def findLCM(arr, idx):
if (idx = = len (arr) - 1 ):
return arr[idx]
a = arr[idx]
b = findLCM(arr, idx + 1 )
return (a * b / / math.gcd(a, b))
def findNum(arr, K):
lcm = findLCM(arr, 0 )
ans = ( pow ( 10 , K) - 1 ) / / lcm
ans = (ans) * lcm
if (ans = = 0 ):
return - 1
return ans
if __name__ = = "__main__" :
arr = [ 2 , 3 , 5 ]
K = 3
print (findNum(arr, K))
|
C#
using System;
using System.Collections;
class GFG
{
static int __gcd( int a, int b)
{
if (a == 0)
return b;
if (b == 0)
return a;
if (a == b)
return a;
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
static int findLCM( int []arr, int idx)
{
if (idx == arr.Length - 1)
{
return arr[idx];
}
int a = arr[idx];
int b = findLCM(arr, idx + 1);
double gcd = __gcd(a, b);
return (a * ( int )Math.Floor(b / gcd));
}
static int findNum( int []arr, int K)
{
int lcm = findLCM(arr, 0);
int ans = ( int )Math.Floor((Math.Pow(10, K) - 1) / lcm);
ans = (ans) * lcm;
if (ans == 0)
return -1;
return ans;
}
public static void Main()
{
int []arr = { 2, 3, 5 };
int K = 3;
Console.Write(findNum(arr, K));
}
}
|
Javascript
<script>
function __gcd(a, b)
{
if (a == 0)
return b;
if (b == 0)
return a;
if (a == b)
return a;
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
function findLCM(arr, idx)
{
if (idx == arr.length - 1)
{
return arr[idx];
}
let a = arr[idx];
let b = findLCM(arr, idx + 1);
return Math.floor((a * b / __gcd(a, b)));
}
function findNum(arr, K)
{
let lcm = findLCM(arr, 0);
let ans = Math.floor((Math.pow(10, K) - 1) / lcm);
ans = (ans) * lcm;
if (ans == 0)
return -1;
return ans;
}
let arr = [ 2, 3, 5 ];
let K = 3;
document.write(findNum(arr, K));
</script>
|
Time Complexity: O(N*logD) where D is the maximum element of the array
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...