Largest number with the given set of N digits that is divisible by 2, 3 and 5
Last Updated :
20 Feb, 2023
Given a set of ‘N’ digits. The task is to find the maximum integer that we can make from these digits. The resultant number must be divisible by 2, 3, and 5.
Note: It is not necessary to use all the digits from the set. Also, leading zeroes are not allowed.
Examples:
Input: N = 11, setOfDigits = {3, 4, 5, 4, 5, 3, 5, 3, 4, 4, 0}
Output: 5554443330
After arranging all the elements in a non-increasing order as 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 0. The sum of all the digit is 40. Thus when we found out that the remainder of 40, when divided by 3, is 1. Then we’ll start traversing from the end to the start and if we encounter any digit with the same remainder, which we got 4 at the position 7 will be erased it. Now the sum is 36 which is divisible 3 and the new largest number will be 5554443330, which is divisible by 2, 3, and 5.
Input: N = 1, setOfDigits = {0}
Output: 0
Approach: Below is the step by step algorithm to solve this problem:
- Initialize the set of digits in a vector.
- Any number is divisible by 2, 3 and 5 only if the sum of digits is divisible by 3 and the last digit is 0.
- Check if 0 is not present in the vector, then it is not possible to create a number because it will not be divisible by 5.
- Sort the vector in a non-increasing manner if the first element is 0 after that, then print 0.
- Find the modulus of sum of all the digits by 3 and if it’s 1 then delete the first element with the same remainder while traversing from the end.
- If there is no element with the same remainder, then delete two elements which has a remainder as 3 – y.
- Print all the remaining digits of a vector as a single integer.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int findLargest( int n, vector< int >& v)
{
int flag = 0;
ll sum = 0;
for ( int i = 0; i < n; i++) {
if (v[i] == 0)
flag = 1;
sum += v[i];
}
if (!flag)
cout << "Not possible" << endl;
else {
sort(v.begin(), v.end(), greater< int >());
if (v[0] == 0) {
cout << "0" << endl;
return 0;
}
else {
int flag = 0;
int y = sum % 3;
if (y != 0) {
for ( int i = n - 1; i >= 0; i--) {
if (v[i] % 3 == y) {
v.erase(v.begin() + i);
flag = 1;
break ;
}
}
if (flag == 0) {
y = 3 - y;
int cnt = 0;
for ( int i = n - 1; i >= 0; i--) {
if (v[i] % 3 == y) {
v.erase(v.begin() + i);
cnt++;
if (cnt >= 2)
break ;
}
}
}
}
if (*v.begin() == 0)
cout << "0" << endl;
else
for ( int i : v) {
cout << i;
}
}
}
}
int main()
{
int n = 11;
vector< int > v{ 3, 9, 9, 6, 4, 3, 6, 4, 9, 6, 0 };
findLargest(n, v);
return 0;
}
|
Java
import java.util.*;
class GFG {
static int findLargest( int n, Vector<Integer> v)
{
int flag = 0 ;
long sum = 0 ;
for ( int i = 0 ; i < n; i++) {
if (v.get(i) == 0 )
flag = 1 ;
sum += v.get(i);
}
if (flag != 1 )
System.out.println( "Not possible" );
else {
Collections.sort(v, Collections.reverseOrder());
if (v.get( 0 ) == 0 ) {
System.out.println( "0" );
return 0 ;
}
else {
int flags = 0 ;
int y = ( int )(sum % 3 );
if (y != 0 ) {
for ( int i = n - 1 ; i >= 0 ; i--) {
if (v.get(i) % 3 == y) {
v.remove(i);
flags = 1 ;
break ;
}
}
if (flags == 0 ) {
y = 3 - y;
int cnt = 0 ;
for ( int i = n - 1 ; i >= 0 ; i--) {
if (v.get(i) % 3 == y) {
v.remove(i);
cnt++;
if (cnt >= 2 )
break ;
}
}
}
}
if (v.get( 0 ) == 0 )
System.out.println( "0" );
else
for (Integer i : v) {
System.out.print(i);
}
}
}
return Integer.MIN_VALUE;
}
public static void main(String[] args)
{
int arr[] = { 3 , 9 , 9 , 6 , 4 , 3 , 6 , 4 , 9 , 6 , 0 };
int n = 11 ;
Vector<Integer> v = new Vector<Integer>();
for ( int i = 0 ; i < n; i++)
v.add(i, arr[i]);
findLargest(n, v);
}
}
|
Python3
def findLargest(n, v):
flag = 0
sum = 0
for i in range (n):
if (v[i] = = 0 ):
flag = 1
sum + = v[i]
if (flag = = 0 ):
print ( "Not possible" )
else :
v.sort(reverse = True )
if (v[ 0 ] = = 0 ):
print ( "0" )
return 0
else :
flag = 0
y = sum % 3
if (y ! = 0 ):
i = n - 1
while (i > = 0 ):
if (v[i] % 3 = = y):
v.remove(v[i])
flag = 1
break
i - = 1
if (flag = = 0 ):
y = 3 - y
cnt = 0
i = n - 1
while (i > = 0 ):
if (v[i] % 3 = = y):
v.remove(v[i])
cnt + = 1
if (cnt > = 2 ):
break
i - = 1
for i in (v):
print (i, end = "")
if __name__ = = '__main__' :
n = 11
v = [ 3 , 9 , 9 , 6 , 4 , 3 ,
6 , 4 , 9 , 6 , 0 ]
findLargest(n, v)
|
C#
using System;
using System.Collections;
class GFG {
static int findLargest( int n, ArrayList v)
{
int flag = 0;
long sum = 0;
for ( int i = 0; i < n; i++) {
if (( int )v[i] == 0)
flag = 1;
sum += ( int )v[i];
}
if (flag != 1)
Console.WriteLine( "Not possible" );
else {
v.Sort();
v.Reverse();
if (( int )v[0] == 0) {
Console.WriteLine( "0" );
return 0;
}
else {
int flags = 0;
int y = ( int )(sum % 3);
if (y != 0) {
for ( int i = n - 1; i >= 0; i--) {
if (( int )v[i] % 3 == y) {
v.RemoveAt(i);
flags = 1;
break ;
}
}
if (flags == 0) {
y = 3 - y;
int cnt = 0;
for ( int i = n - 1; i >= 0; i--) {
if (( int )v[i] % 3 == y) {
v.RemoveAt(i);
cnt++;
if (cnt >= 2)
break ;
}
}
}
}
if (( int )v[0] == 0)
Console.WriteLine( "0" );
else
for ( int i = 0; i < v.Count; i++) {
Console.Write(v[i]);
}
}
}
return int .MinValue;
}
static void Main()
{
int [] arr = { 3, 9, 9, 6, 4, 3, 6, 4, 9, 6, 0 };
int n = 11;
ArrayList v = new ArrayList();
for ( int i = 0; i < n; i++)
v.Add(arr[i]);
findLargest(n, v);
}
}
|
Javascript
<script>
function findLargest(n,v)
{
let flag = 0;
let sum = 0;
for (let i = 0; i <n; i++) {
if (v[i] == 0)
flag = 1;
sum += v[i];
}
if (!flag)
document.write( "Not possible" , "</br>" );
else {
v.sort((a,b)=>b-a);
if (v[0] == 0) {
document.write( "0" , "</br>" );
return 0;
}
else {
let flag = 0;
let y = sum % 3;
if (y != 0) {
for (let i = n - 1; i >= 0; i--) {
if (v[i] % 3 == y) {
v = v.splice(i,1);
flag = 1;
break ;
}
}
if (flag == 0) {
y = 3 - y;
let cnt = 0;
for (let i = n - 1; i >= 0; i--) {
if (v[i] % 3 == y) {
v.splice(i,1);
cnt++;
if (cnt >= 2)
break ;
}
}
}
}
if (v[0] == 0)
document.write( "0" , "</br>" );
else
for (let i of v) {
document.write(i);
}
}
}
}
let n = 11;
let v = [ 3, 9, 9, 6, 4, 3, 6, 4, 9, 6, 0 ];
findLargest(n, v);
</script>
|
Time Complexity: O(n log n)
Space Complexity: O(1)
Alternate Solution :
Below is an implementation by Keegan Fisher, Seattle, WA
C++
#include <bits/stdc++.h>
using namespace std;
string findLargest( int vals[], int N)
{
sort(vals, vals + N);
string sb;
int index_div_3 = -1;
bool zero = false ;
for ( int i = 0; i < N; i++)
{
if (vals[i] % 3 == 0 && vals[i] != 0)
{
index_div_3 = i;
break ;
}
if (vals[i] == 0)
{
zero = true ;
}
}
if (index_div_3 == -1 || !zero)
{
return sb;
}
for ( int i = N - 1; i >= 0; i--)
{
if (i != index_div_3)
{
if (vals[i] == 0 && index_div_3 != -1)
{
sb = sb + to_string(vals[index_div_3]);
sb = sb + to_string(vals[i]);
index_div_3 = -1;
}
else
{
sb = sb + to_string(vals[i]);
}
}
}
return sb;
}
int main()
{
int vals[] = { 0, 0, 0, 2, 3, 4, 2, 7, 6, 9 };
int N = sizeof (vals) / sizeof (vals[0]);
cout << "Output = " << findLargest(vals, N) << endl;
return 0;
}
|
Java
import java.util.Arrays;
class GFG {
public static void main()
{
int [] vals = { 0 , 0 , 0 , 2 , 3 , 4 , 2 , 7 , 6 , 9 };
System.out.println( "Output = " + findLargest(vals));
}
public static String findLargest( int [] vals)
{
Arrays.sort(vals);
StringBuilder sb = new StringBuilder();
int index_div_3 = - 1 ;
boolean zero = false ;
for ( int i = 0 ; i < vals.length; i++) {
if (vals[i] % 3 == 0 && vals[i] != 0 ) {
index_div_3 = i;
break ;
}
if (vals[i] == 0 ) {
zero = true ;
}
}
if (index_div_3 == - 1 || !zero) {
return sb.toString();
}
for ( int i = vals.length - 1 ; i >= 0 ; i--) {
if (i != index_div_3) {
if (vals[i] == 0 && index_div_3 != - 1 ) {
sb.append(vals[index_div_3]);
sb.append(vals[i]);
index_div_3 = - 1 ;
}
else {
sb.append(vals[i]);
}
}
}
return sb.toString();
}
}
|
Python3
def findLargest (vals):
vals.sort()
sb = ""
index_div_3 = - 1
zero = False
for i in range ( len (vals)):
if (vals[i] % 3 = = 0 and vals[i] ! = 0 ):
index_div_3 = i
break
if (vals[i] = = 0 ):
zero = True
if (index_div_3 = = - 1 or zero = = False ):
return str (sb)
for i in range ( len (vals) - 1 , - 1 , - 1 ):
if (i ! = index_div_3):
if (vals[i] = = 0 and index_div_3 ! = - 1 ):
sb + = str (vals[index_div_3])
sb + = str (vals[i])
index_div_3 = - 1
else :
sb + = str (vals[i])
return str (sb)
if __name__ = = '__main__' :
vals = [ 0 , 0 , 0 , 2 , 3 , 4 , 2 , 7 , 6 , 9 ]
print ( "Output =" , findLargest(vals))
|
C#
using System;
using System.Text;
class GFG
{
public static void Main()
{
int [] vals = { 0, 0, 0, 2, 3, 4, 2, 7, 6, 9 };
Console.WriteLine( "Output = " + findLargest(vals));
}
public static string findLargest( int [] vals)
{
Array.Sort(vals);
StringBuilder sb = new StringBuilder();
int index_div_3 = -1;
bool zero = false ;
for ( int i = 0; i < vals.Length; i++) {
if (vals[i] % 3 == 0 && vals[i] != 0) {
index_div_3 = i;
break ;
}
if (vals[i] == 0) {
zero = true ;
}
}
if (index_div_3 == -1 || !zero) {
return sb.ToString();
}
for ( int i = vals.Length - 1; i >= 0; i--) {
if (i != index_div_3) {
if (vals[i] == 0 && index_div_3 != -1) {
sb.Append(vals[index_div_3]);
sb.Append(vals[i]);
index_div_3 = -1;
}
else {
sb.Append(vals[i]);
}
}
}
return sb.ToString();
}
}
|
Javascript
<script>
function findLargest (vals){
vals.sort()
let sb = ""
let index_div_3 = -1
let zero = false
for (let i=0;i<vals.length;i++){
if (vals[i] % 3 == 0 && vals[i] != 0){
index_div_3 = i
break
}
if (vals[i] == 0)
zero = true
}
if (index_div_3 == -1 || zero == false )
return sb
for (let i=vals.length - 1;i>=0;i--){
if (i != index_div_3){
if (vals[i] == 0 && index_div_3 != -1){
sb += parseInt(vals[index_div_3])
sb += parseInt(vals[i])
index_div_3 = -1
}
else
sb += parseInt(vals[i])
}
}
return sb
}
let vals = [ 0, 0, 0, 2, 3, 4, 2, 7, 6, 9 ]
document.write( "Output =" , findLargest(vals))
</script>
|
Output:
Output = 9764223000
Time Complexity: O(n log n)
Space Complexity: O(1)
Share your thoughts in the comments
Please Login to comment...