Maximum number which can divide all array element after one replacement
Last Updated :
06 Oct, 2021
Given an array arr, replace any one element in array with any other integer. The task is to return the maximum number which divides all elements in this array completely.
Examples:
Input: arr = [15, 9, 3]
Output: 3
Explanation: Here replace 15 with 3 so array becomes arr = [3, 9, 3] and now all elements in array are divisible by 3, so 3 is our answer
Input: arr = [16, 5, 10, 25]
Output: 5
Approach: To solve the above problem:
Below is the implementation of the above approach:
C++14
#include <bits/stdc++.h>
using namespace std;
int gcdOfTwoNos( int num1, int num2)
{
if (num1 == 0)
return num2;
if (num2 == 0)
return num1;
if (num1 == num2)
return num1;
if (num1 > num2)
return gcdOfTwoNos(num1 - num2, num2);
return gcdOfTwoNos(num1, num2 - num1);
}
int Min_sum( int arr[], int N)
{
int min_sum = 1000000, maxGcd = 1;
for ( int i = 0; i < N; i++) {
int gcd;
if (i == 0)
gcd = arr[1];
else {
gcd = arr[i - 1];
}
for ( int j = 0; j < N; j++) {
if (j != i)
gcd = gcdOfTwoNos(gcd, arr[j]);
}
int c = arr[i];
if (gcd > maxGcd)
maxGcd = gcd;
}
return maxGcd;
}
int main()
{
int arr[] = { 16, 5, 10, 25 };
int N = sizeof (arr) / sizeof ( int );
cout << Min_sum(arr, N);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int gcdOfTwoNos( int num1, int num2)
{
if (num1 == 0 )
return num2;
if (num2 == 0 )
return num1;
if (num1 == num2)
return num1;
if (num1 > num2)
return gcdOfTwoNos(num1 - num2, num2);
return gcdOfTwoNos(num1, num2 - num1);
}
static int Min_sum( int arr[], int N)
{
int min_sum = 1000000 , maxGcd = 1 ;
for ( int i = 0 ; i < N; i++) {
int gcd;
if (i == 0 )
gcd = arr[ 1 ];
else {
gcd = arr[i - 1 ];
}
for ( int j = 0 ; j < N; j++) {
if (j != i)
gcd = gcdOfTwoNos(gcd, arr[j]);
}
int c = arr[i];
if (gcd > maxGcd)
maxGcd = gcd;
}
return maxGcd;
}
public static void main (String[] args) {
int arr[] = { 16 , 5 , 10 , 25 };
int N = arr.length;
System.out.println( Min_sum(arr, N));
}
}
|
Python3
def gcd1OfTwoNos(num1, num2):
if (num1 = = 0 ):
return num2
if (num2 = = 0 ):
return num1
if (num1 = = num2):
return num1
if (num1 > num2):
return gcd1OfTwoNos(num1 - num2, num2)
return gcd1OfTwoNos(num1, num2 - num1)
def Min_sum(arr, N):
min_sum = 1000000
maxgcd1 = 1
for i in range (N):
gcd1 = 1
if (i = = 0 ):
gcd1 = arr[ 1 ]
else :
gcd1 = arr[i - 1 ]
for j in range (N):
if (j ! = i):
gcd1 = gcd1OfTwoNos(gcd1, arr[j])
c = arr[i]
if (gcd1 > maxgcd1):
maxgcd1 = gcd1
return maxgcd1
if __name__ = = '__main__' :
arr = [ 16 , 5 , 10 , 25 ]
N = len (arr)
print (Min_sum(arr, N))
|
C#
using System;
public class GFG
{
static int gcdOfTwoNos( int num1, int num2)
{
if (num1 == 0)
return num2;
if (num2 == 0)
return num1;
if (num1 == num2)
return num1;
if (num1 > num2)
return gcdOfTwoNos(num1 - num2, num2);
return gcdOfTwoNos(num1, num2 - num1);
}
static int Min_sum( int []arr, int N)
{
int min_sum = 1000000, maxGcd = 1;
for ( int i = 0; i < N; i++) {
int gcd;
if (i == 0)
gcd = arr[1];
else {
gcd = arr[i - 1];
}
for ( int j = 0; j < N; j++) {
if (j != i)
gcd = gcdOfTwoNos(gcd, arr[j]);
}
if (gcd > maxGcd)
maxGcd = gcd;
}
return maxGcd;
}
public static void Main ( string [] args) {
int []arr = { 16, 5, 10, 25 };
int N = arr.Length;
Console.WriteLine(Min_sum(arr, N));
}
}
|
Javascript
<script>
function gcdOfTwoNos(num1, num2)
{
if (num1 == 0)
return num2;
if (num2 == 0)
return num1;
if (num1 == num2)
return num1;
if (num1 > num2)
return gcdOfTwoNos(num1 - num2, num2);
return gcdOfTwoNos(num1, num2 - num1);
}
function Min_sum(arr, N)
{
let min_sum = 1000000, maxGcd = 1;
for (let i = 0; i < N; i++) {
let gcd;
if (i == 0)
gcd = arr[1];
else {
gcd = arr[i - 1];
}
for (let j = 0; j < N; j++) {
if (j != i)
gcd = gcdOfTwoNos(gcd, arr[j]);
}
let c = arr[i];
if (gcd > maxGcd)
maxGcd = gcd;
}
return maxGcd;
}
let arr = [ 16, 5, 10, 25 ];
let N = arr.length;
document.write( Min_sum(arr, N));
</script>
|
Time Complexity: O((N^2) * Log(M)), Where M is minimum value in array
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...