Considere a função seguinte, codificada na linguagem ...

Próximas questões
Com base no mesmo assunto
Q445742 Programação
Considere a função seguinte, codificada na linguagem de programação C:

int F (int a, int b)
{

      while (a > 0 && b > 0)
       {

             if (a > b)
                  a = a – b;
            else
                  b = b – a;

        }

        return a + b;
}

Na execução da função F, o maior número de iterações ocorre com a chamada:
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

A alternativa correta é a E - F (18, 1).

A questão aborda o conceito de laços de repetição na linguagem de programação C, mais especificamente um laço while, e exige do candidato a habilidade de entender a lógica de funcionamento deste laço para determinar qual chamada de função resultará no maior número de iterações. O laço de repetição continuará executando até que uma das condições de parada seja satisfeita, neste caso, até que a variável a ou a variável b seja menor ou igual a zero.

O corpo do laço contém uma estrutura condicional if...else que decrementa a maior das duas variáveis pela menor, o que é uma forma de aproximar os valores de a e b um do outro a cada iteração. A questão se torna um problema de encontrar o par de valores que levará o maior tempo para que um deles atinja zero ou um valor negativo (o que nunca ocorrerá, dada a condição de parada a > 0 && b > 0).

A lógica por trás da alternativa correta (E - F (18, 1)) é que a diferença entre os valores de a e b será reduzida de forma mais lenta quando um dos valores for 1. Isto ocorre porque a cada iteração do laço, a variável maior terá apenas uma unidade subtraída. Assim, quando a função é chamada com os argumentos (18, 1), o valor 18 será reduzido por 1 a cada iteração do laço, resultando em um total de 17 iterações, o que é o número máximo possível de iterações antes que a ou b se torne zero ou negativo sob as condições de parada especificadas.

As outras opções resultam em um número menor de iterações porque a diferença entre a e b é reduzida mais rapidamente devido ao valor inicial mais alto de b. Por exemplo, na opção A (18, 12), apenas algumas iterações são necessárias para que uma das variáveis atinja zero, pois o valor de b é subtraído de a em grandes passos.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

while (a > 0 && b > 0)

if (a > b)

Isso quer dizer que ‘b’ é maior que zero e ‘b’ não pode ser maior que ‘a’ e ‘a’ é maior que zero, ou seja, a > b = 2 > 1

a = a – b

a = 1 -1

a = 0

 

b =b – a

b = 1 - 0

b =1

 

return = 0 +1

return = 1

F (18,1)

A RESPOSTA E ARTENATIVA E POIS RODE ESSE CODIGO #include <stdio.h>

int F(int a, int b, int *iteracoes) {

  *iteracoes = 0; // Inicializa o contador de iterações

  while (a > 0 && b > 0) {

    (*iteracoes)++; // Incrementa o contador a cada iteração

    if (a > b)

      a = a - b;

    else

      b = b - a;

  }

  return a + b;

}

int main() {

  int num1 = 18, num2 = 1; // Os números para a chamada de exemplo

  int iteracoes;

  int resultado = F(num1, num2, &iteracoes);

  printf("O máximo divisor comum é: %d\n", resultado);

  printf("Número de iterações: %d\n", iteracoes);

  return 0;

}

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo