Questão nº 61

Questão de Tecnologia da Informação · FGV SMF-RJ 2023 - Manhã (P1) (nº 61)

FGV2023Fiscal de RendasTecnologia da Informação
Gabarito: Dver comentário ↓

Considere a existência de uma tabela relacional N, com apenas uma coluna, intitulada numero, contendo os números inteiros de 1 até 100, um em cada linha, como ilustrada a seguir.

Figura da questão de Tecnologia da Informação

Como pode haver discrepâncias entre implementações da linguagem SQL, é dado que a função sqrt(x) retorna a raiz quadrada de x e que a expressão a % b retorna o resto da divisão inteira de a por b.


Numa definição simplificada, números primos são os números inteiros a partir de 2 que só são divisíveis por eles mesmos e o número 1.

Assinale o comando SQL que produz a lista de todos, e somente, os números primos presentes na tabela N, descrita anteriormente.

Resposta comentada

Gabarito Alternativa D

Um número primo é um número inteiro maior que 1 que só pode ser dividido exatamente por 1 e por ele mesmo. Para verificar se um número é primo, procuramos por divisores (números que o dividem sem deixar resto) entre 2 e a raiz quadrada desse número. Se nenhum divisor for encontrado nesse intervalo, o número é primo.

  • (A) Incorreta: Esta consulta exclui todos os números maiores que 1. A condição N1.numero % N2.numero = 0 no EXISTS será sempre verdadeira para N2.numero = N1.numero (já que todo número é divisível por si mesmo), fazendo com que NOT EXISTS seja sempre falsa. Assim, nenhum número seria retornado.
  • (B) Incorreta: Embora esta consulta produza o resultado correto, ela é menos eficiente do que a alternativa D. A condição N2.numero < N1.numero faz com que o SQL verifique divisores até N1.numero - 1. Matematicamente, basta verificar divisores até a raiz quadrada do número, tornando esta busca mais longa do que o necessário e, portanto, uma solução subótima.
  • (C) Incorreta: Similar à alternativa A, esta consulta exclui todos os números maiores que 1. A condição N2.numero <= N1.numero permite que N2.numero seja igual a N1.numero, o que faz com que N1.numero % N2.numero = 0 seja sempre verdadeiro. Isso resulta em EXISTS ser sempre verdadeiro e NOT EXISTS ser sempre falso, não retornando nenhum número.
  • (D) Correta: Esta é a forma mais eficiente e matematicamente otimizada para identificar números primos. A consulta seleciona N1.numero se ele for maior que 1 e se não existir nenhum N2.numero (potencial divisor) tal que N2.numero seja maior que 1, N2.numero seja menor ou igual à raiz quadrada de N1.numero (sqrt(N1.numero)) e N1.numero seja divisível por N2.numero (N1.numero % N2.numero = 0). A verificação até a raiz quadrada é suficiente porque se um número n tem um divisor d > sqrt(n), ele também deve ter um divisor n/d < sqrt(n).
  • (E) Incorreta: Assim como a alternativa B, esta consulta produz o resultado correto, mas é menos eficiente que a alternativa D. A condição N2.numero <= N1.numero / 2 faz com que o SQL verifique divisores até a metade de N1.numero. Embora seja uma otimização em relação a verificar até N1.numero - 1, ainda é menos eficiente do que verificar apenas até sqrt(N1.numero), que é o limite matemático mais restrito para a busca de divisores.

Fonte: FGV SMF-RJ 2023 - Manhã (P1) Fiscal de Rendas (Caderno Tipo 1). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho