Construya una array a partir de GCD de elementos consecutivos en una array dada

Dada una array a[] de n elementos. La tarea es encontrar la array (digamos b[]) de n + 1 tal que el Máximo Común Divisor de b[i] y b[i + 1] sea igual a a[i]. Si existe una solución múltiple, imprima aquella cuya suma de array sea mínima.
Ejemplos: 
 

Input : a[] = { 1, 2, 3 }
Output : 1 2 6 3
GCD(1, 2) = 1
GCD(2, 6) = 2
GCD(6, 3) = 3
Also, 1 + 2 + 6 + 3 = 12 which is smallest among all
possible value of array that can be constructed.

Input : a[] = { 5, 10, 5 }
Output : 5 10 10 5

Supongamos que solo hay un número en la array dada a[]. Sea K, entonces ambos números en la array construida (digamos b[]) serán K y K.
Entonces, el valor de b[0] será solo a[0]. Ahora considere que hemos terminado hasta el índice i , es decir, ya hemos procesado hasta el índice i y hemos calculado b[i + 1].
Ahora el mcd(b[i + 1], b[i + 2]) = a[i + 1] y mcd(b[i + 2], b[i + 3]) = a[i + 2]. Entonces, b[i + 2] >= mcm(a[i + 1], a[i + 2]). O bien, b[i + 2] será múltiplo de mcm(a[i + 1], a[i + 2]). Como queremos la suma mínima, queremos el valor mínimo de b[i + 2]. Entonces, b[i + 2] = mcm(a[i + 2], a[i + 3]).
A continuación se muestra la implementación de este enfoque: 
 

C++

// CPP Program to construct an array whose GCD of
// every consecutive element is the given array
#include <bits/stdc++.h>
using namespace std;
 
// Return the LCM of two numbers.
int lcm(int a, int b)
{
    return (a * b) / __gcd(a, b);
}
 
// Print the required constructed array
void printArray(int a[], int n)
{
    // printing the first element.
    cout << a[0] << " ";
 
    // finding and printing the LCM of consecutive
    // element of given array.
    for (int i = 0; i < n - 1; i++)
        cout << lcm(a[i], a[i + 1]) << " ";
 
    // printing the last element of the given array.
    cout << a[n - 1] << endl;
}
 
// Driven Program
int main()
{
    int a[] = { 1, 2, 3 };
    int n = sizeof(a) / sizeof(a[0]);
    printArray(a, n);
    return 0;
}

Java

// Java Program to construct an array whose
// GCD of every consecutive element is the
// given array
 
import java.io.*;
 
class GFG {
     
    // Recursive function to return gcd of
    // a and b
    static int __gcd(int a, int b)
    {
         
        // Everything divides 0
        if (a == 0 || b == 0)
        return 0;
     
        // base case
        if (a == b)
            return a;
     
        // a is greater
        if (a > b)
            return __gcd(a - b, b);
             
        return __gcd(a, b - a);
    }
 
    // Return the LCM of two numbers.
    static int lcm(int a, int b)
    {
        return (a * b) / __gcd(a, b);
    }
     
    // Print the required constructed array
    static void printArray(int a[], int n)
    {
         
        // printing the first element.
        System.out.print( a[0] + " ");
     
        // finding and printing the LCM of
        // consecutive element of given array.
        for (int i = 0; i < n - 1; i++)
            System.out.print(lcm(a[i],
                            a[i + 1]) + " ");
     
        // printing the last element of the
        // given array.
        System.out.print(a[n - 1]);
    }
     
    // Driven Program
    public static void main (String[] args)
    {
        int a[] = { 1, 2, 3 };
        int n = a.length;
        printArray(a, n);
    }
}
 
// This code is contributed by anuj_67.

Python3

# Python Program to construct an array whose
# GCD of every consecutive element is the
# given array
 
# Recursive function to return gcd of
# a and b
def __gcd( a, b):
         
    # Everything divides 0
    if (a == 0 or b == 0):
        return 0
         
    # base case
    if (a == b):
        return a
         
    # a is greater
    if (a > b):
        return __gcd(a - b, b)        
    return __gcd(a, b - a)
     
# Return the LCM of two numbers.
def lcm(a, b):
    return (a * b) / __gcd(a, b)
 
# Print the required constructed array
def printArray(a, n):
         
    # printing the first element.
    print ( str(a[0]) + " ")
         
    # finding and printing the LCM of
    # consecutive element of given array.
    for i in range(0,n-1):
        print (str(lcm(a[i],a[i + 1])) + " ")
         
    # printing the last element of the
    # given array.
    print (a[n - 1])
 
# Driver code
a = [1, 2, 3 ]
n = len(a)
printArray(a, n)
 
# This code is contributed by Prateek Bajaj

C#

// C# Program to construct an array whose
// GCD of every consecutive element is the
// given array
using System;
class GFG {
     
    // Recursive function to return
    // gcd of a and b
    static int __gcd(int a, int b)
    {
        // Everything divides 0
        if (a == 0 || b == 0)
        return 0;
     
        // base case
        if (a == b)
            return a;
     
        // a is greater
        if (a > b)
            return __gcd(a - b, b);
             
        return __gcd(a, b - a);
    }
 
    // Return the LCM of two numbers.
    static int lcm(int a, int b)
    {
        return (a * b) / __gcd(a, b);
    }
     
    // Print the required constructed array
    static void printArray(int []a, int n)
    {
         
        // printing the first element.
        Console.Write( a[0] + " ");
     
        // finding and printing the LCM of
        // consecutive element of given array.
        for (int i = 0; i < n - 1; i++)
            Console.Write(lcm(a[i],
                  a[i + 1]) + " ");
     
        // printing the last element
        // of the given array.
        Console.Write(a[n - 1]);
    }
     
    // Driver Code
    public static void Main ()
    {
        int []a = {1, 2, 3};
        int n = a.Length;
        printArray(a, n);
    }
}
 
// This code is contributed by anuj_67.

PHP

<?php
// PHP Program to construct
// an array whose GCD of
// every consecutive element
// is the given array
 
// Recursive function to
// return gcd of a and b
function __gcd($a, $b)
{
     
    // Everything divides 0
    if($a == 0 or $b == 0)
        return 0 ;
 
    // base case
    if($a == $b)
        return $a ;
     
    // a is greater
    if($a > $b)
        return __gcd( $a - $b , $b ) ;
 
    return __gcd( $a , $b - $a ) ;
}
 
// Return the LCM of two numbers.
function lcm($a, $b)
{
    return ($a * $b) / __gcd($a, $b);
}
 
// Print the required constructed array
function printArray( $a, $n)
{
     
    // printing the first element.
    echo $a[0] , " ";
 
    // finding and printing
    // the LCM of consecutive
    // element of given array.
    for ( $i = 0; $i < $n - 1; $i++)
        echo lcm($a[$i], $a[$i + 1]) , " ";
 
    // printing the last element
    // of the given array.
    echo $a[$n - 1] ,"\n";
}
 
    // Driver Code
    $a = array(1, 2, 3);
    $n = count($a);
    printArray($a, $n);
 
// This code is contributed by anuj_67.
?>

Javascript

<script>
 
// Javascript Program to construct an array whose GCD of
// every consecutive element is the given array
 
function __gcd(a, b)
    {
        // Everything divides 0
        if (a == 0 || b == 0)
        return 0;
     
        // base case
        if (a == b)
            return a;
     
        // a is greater
        if (a > b)
            return __gcd(a - b, b);
             
        return __gcd(a, b - a);
    }
 
// Return the LCM of two numbers.
function lcm(a, b)
{
    return (a * b) / __gcd(a, b);
}
 
// Print the required constructed array
function printArray(a, n)
{
 
    // printing the first element.
    document.write( a[0] + " ");
 
    // finding and printing the LCM of consecutive
    // element of given array.
    for (var i = 0; i < n - 1; i++)
        document.write( lcm(a[i], a[i + 1]) + " ");
 
    // printing the last element of the given array.
    document.write( a[n - 1] + "<br>");
}
 
// Driven Program
var a = [ 1, 2, 3 ];
var n = a.length;
printArray(a, n);
 
// This code is contributed by rrrtnx.
</script>

Producción 
 

1 2 6 3

Publicación traducida automáticamente

Artículo escrito por anuj0503 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *