Considere a função seguinte, codificada na linguagem ...
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:
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