Online C Compiler
Abrir no compilador

Edição didática em português. O código e suas saídas preservam o original.

Funções recursivas: MDC e MMC de um array

Combine o algoritmo de Euclides com parâmetros de saída por ponteiros.

Abrir no compilador

Funções recursivas: MDC e MMC de um array
Combine o algoritmo de Euclides com parâmetros de saída por ponteiros.

Leia K inteiros positivos. Implemente gcd(a, b) recursivamente com gcd(b, a % b) e o caso base b == 0. Calcule o mínimo múltiplo comum com (a / gcd(a, b)) * b.

Implemente find_array_gcd_lcm com os parâmetros k, arr, out_gcd e out_lcm. Percorra o array acumulando os dois resultados e escreva-os pelos ponteiros de saída. Imprima os rótulos Array GCD: e Array LCM: sem traduzi-los.

Entrada

Primeira linha: K. Segunda linha: K inteiros positivos separados por espaços.

Saída

Array GCD: <mdc> | Array LCM: <mmc>

Restrições

  • 2 <= K <= 10
  • 1 <= arr[i] <= 1.000.000
  • O MMC final cabe em um long long com sinal de 64 bits.
Dicas
  • Quando b == 0, retorne a; caso contrário, chame gcd(b, a % b).
  • Divida antes de multiplicar ao calcular o MMC.

Código C

#include <stdio.h>

// Recursive Euclidean algorithm
long long gcd(long long a, long long b) {
    // TODO: Base case and recursive call
    return 0;
}

long long lcm(long long a, long long b) {
    // TODO: (a / gcd(a, b)) * b
    return 0;
}

// Function modifying outputs via pointers
void find_array_gcd_lcm(int k, long long arr[], long long *out_gcd, long long *out_lcm) {
    // TODO: Loop through array and accumulate overall GCD and LCM
}

int main(void) {
    int k;
    if (scanf("%d", &k) != 1 || k < 2) return 1;

    long long arr[10];
    for (int i = 0; i < k; i++) {
        scanf("%lld", &arr[i]);
    }

    long long result_gcd = 0;
    long long result_lcm = 0;

    find_array_gcd_lcm(k, arr, &result_gcd, &result_lcm);

    printf("Array GCD: %lld | Array LCM: %lld\n", result_gcd, result_lcm);
    return 0;
}
Abrir no compilador
Solução e explicação

Inicialize os dois acumuladores com o primeiro elemento e combine cada elemento seguinte com eles. Euclides reduz o segundo operando até zero.

Dividir pelo MDC antes de multiplicar evita um produto intermediário desnecessariamente grande. A garantia de faixa do exercício continua necessária; a fórmula não elimina todo risco de estouro para entradas arbitrárias.

C passa o valor de cada ponteiro; escrever em *out_gcd e *out_lcm modifica os objetos do chamador. Cada cálculo de MDC é logarítmico no menor operando e a recursão usa uma pilha de profundidade logarítmica.

Código da solução

#include <stdio.h>

// Recursive Euclidean algorithm
long long gcd(long long a, long long b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

// Compute LCM preventing overflow by dividing before multiplying
long long lcm(long long a, long long b) {
    if (a == 0 || b == 0) return 0;
    return (a / gcd(a, b)) * b;
}

// Compute GCD and LCM for an array using pointers
void find_array_gcd_lcm(int k, long long arr[], long long *out_gcd, long long *out_lcm) {
    if (k <= 0) return;

    long long current_gcd = arr[0];
    long long current_lcm = arr[0];

    for (int i = 1; i < k; i++) {
        current_gcd = gcd(current_gcd, arr[i]);
        current_lcm = lcm(current_lcm, arr[i]);
    }

    *out_gcd = current_gcd;
    *out_lcm = current_lcm;
}

int main(void) {
    int k;
    if (scanf("%d", &k) != 1 || k < 2 || k > 10) return 1;

    long long arr[10];
    for (int i = 0; i < k; i++) {
        if (scanf("%lld", &arr[i]) != 1) return 1;
    }

    long long result_gcd = 0;
    long long result_lcm = 0;

    find_array_gcd_lcm(k, arr, &result_gcd, &result_lcm);

    printf("Array GCD: %lld | Array LCM: %lld\n", result_gcd, result_lcm);
    return 0;
}

Perguntas frequentes

Por que o código e a saída continuam em inglês?

Palavras-chave, identificadores e textos verificados pelos testes são preservados para não alterar o programa. As explicações e os controles estão traduzidos.