Desafios de Lógica de Programação Resolvidos Passo a Passo

Dominar a lógica de programação é o primeiro passo para se tornar um desenvolvedor completo. Pensando nisso, organizei uma lista com 10 desafios clássicos resolvidos em JavaScript e Python, com explicações detalhadas de cada raciocínio. Se você está estudando por conta própria ou se preparando para entrevistas técnicas, este material vai te ajudar a consolidar os fundamentos.

Antes de mergulharmos, que tal revisar os exercícios de lógica para iniciantes ou dar uma olhada na minha coleção de estudos de lógica com projetos interativos? Bônus de boas-vindas até R$1.500

1. FizzBuzz

Enunciado: Escreva um programa que imprima os números de 1 a 100. Para múltiplos de 3, imprima "Fizz". Para múltiplos de 5, imprima "Buzz". Para números que são múltiplos de ambos, imprima "FizzBuzz".

Raciocínio: A chave aqui é usar o operador módulo (%) para verificar divisibilidade. Testamos primeiro a condição mais específica (múltiplo de 3 e 5) antes das condições individuais.

JavaScript
for (let i = 1; i <= 100; i++) {
  let output = '';
  if (i % 3 === 0) output += 'Fizz';
  if (i % 5 === 0) output += 'Buzz';
  console.log(output || i);
}
Python
for i in range(1, 101):
    output = ''
    if i % 3 == 0:
        output += 'Fizz'
    if i % 5 == 0:
        output += 'Buzz'
    print(output or i)

2. Sequência de Fibonacci

Enunciado: Gere os primeiros N termos da sequência de Fibonacci, onde cada termo é a soma dos dois anteriores. Começando com 0 e 1.

Raciocínio: Utilizamos uma estrutura de repetição (for/while) para iterar N vezes. A cada iteração, calculamos o próximo termo e atualizamos as variáveis.

JavaScript
function fibonacci(n) {
  let seq = [0, 1];
  for (let i = 2; i < n; i++) {
    seq[i] = seq[i - 1] + seq[i - 2];
  }
  return seq.slice(0, n);
}

console.log(fibonacci(10)); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Python
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        print(a, end=' ')
        a, b = b, a + b

fibonacci(10)  # 0 1 1 2 3 5 8 13 21 34

3. Número Primo

Enunciado: Escreva uma função que verifique se um número é primo. Um número primo é divisível apenas por 1 e por ele mesmo.

Raciocínio: Números menores que 2 não são primos. Para os demais, verificamos a divisibilidade por todos os números de 2 até a raiz quadrada do número. Se nenhum dividir exatamente, ele é primo.

JavaScript
function ehPrimo(num) {
  if (num < 2) return false;
  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (num % i === 0) return false;
  }
  return true;
}

console.log(ehPrimo(7));  // true
console.log(ehPrimo(10)); // false
Python
import math

def eh_primo(num):
    if num < 2:
        return False
    for i in range(2, int(math.sqrt(num)) + 1):
        if num % i == 0:
            return False
    return True

print(eh_primo(7))  # True
print(eh_primo(10)) # False

4. Cálculo de Fatorial

Enunciado: Calcule o fatorial de um número N. O fatorial de N (N!) é o produto de todos os inteiros de 1 até N.

Raciocínio: Podemos resolver com um laço de repetição, multiplicando o resultado acumulado pelo número da iteração. Também é um clássico exemplo de recursão.

JavaScript
function fatorialIterativo(n) {
  let resultado = 1;
  for (let i = 2; i <= n; i++) {
    resultado *= i;
  }
  return resultado;
}

function fatorialRecursivo(n) {
  if (n === 0 || n === 1) return 1;
  return n * fatorialRecursivo(n - 1);
}

console.log(fatorialIterativo(5)); // 120
console.log(fatorialRecursivo(5)); // 120
Python
def fatorial_iterativo(n):
    resultado = 1
    for i in range(2, n + 1):
        resultado *= i
    return resultado

def fatorial_recursivo(n):
    if n in (0, 1):
        return 1
    return n * fatorial_recursivo(n - 1)

print(fatorial_iterativo(5))  # 120
print(fatorial_recursivo(5))  # 120

5. Inversão de String

Enunciado: Escreva uma função que inverta uma string sem usar funções prontas de reversão.

Raciocínio: Convertemos a string para um array de caracteres, ou iteramos de trás para frente concatenando os caracteres. Em JavaScript, podemos usar um laço decrescente. Em Python, o slicing resolve de forma elegante.

JavaScript
function inverterString(str) {
  let invertida = '';
  for (let i = str.length - 1; i >= 0; i--) {
    invertida += str[i];
  }
  return invertida;
}

console.log(inverterString('C-Hub')); // buH-C
Python
def inverter_string(s):
    invertida = ''
    for char in s[::-1]:
        invertida += char
    return invertida

print(inverter_string('C-Hub'))  # buH-C

6. Par ou Ímpar

Enunciado: Dado um número inteiro, determine se ele é par ou ímpar.

Raciocínio: Se o número for divisível por 2 (resto da divisão igual a zero), ele é par. Caso contrário, é ímpar.

JavaScript
function parOuImpar(num) {
  return num % 2 === 0 ? 'Par' : 'Ímpar';
}

console.log(parOuImpar(7));  // Ímpar
console.log(parOuImpar(10)); // Par
Python
def par_ou_impar(num):
    return 'Par' if num % 2 == 0 else 'Ímpar'

print(par_ou_impar(7))   # Ímpar
print(par_ou_impar(10))  # Par

7. Maior de Três Números

Enunciado: Dados três números, encontre o maior valor entre eles.

Raciocínio: Podemos usar uma função que compara os números usando uma variável temporária ou a função Math.max.

JavaScript
function maiorDeTres(a, b, c) {
  let maior = a;
  if (b > maior) maior = b;
  if (c > maior) maior = c;
  return maior;
}

console.log(maiorDeTres(10, 25, 7)); // 25
Python
def maior_de_tres(a, b, c):
    return max(a, b, c)

print(maior_de_tres(10, 25, 7))  # 25

8. Tabuada

Enunciado: Exiba a tabuada de um número N, de 1 a 10.

Raciocínio: Um laço de repetição de 1 a 10 multiplica o número base pelo contador e exibe o resultado.

JavaScript
function tabuada(n) {
  for (let i = 1; i <= 10; i++) {
    console.log(`${n} x ${i} = ${n * i}`);
  }
}

tabuada(7);
Python
def tabuada(n):
    for i in range(1, 11):
        print(f'{n} x {i} = {n * i}')

tabuada(7)

9. Cálculo de Média Ponderada

Enunciado: Calcule a média ponderada de três notas com pesos específicos (ex: 2, 3 e 5).

Raciocínio: A média ponderada é calculada somando o produto de cada nota pelo seu peso e dividindo pela soma dos pesos.

JavaScript
function mediaPonderada(notas, pesos) {
  let somaNotas = 0;
  let somaPesos = 0;
  for (let i = 0; i < notas.length; i++) {
    somaNotas += notas[i] * pesos[i];
    somaPesos += pesos[i];
  }
  return somaNotas / somaPesos;
}

console.log(mediaPonderada([7, 8, 9], [2, 3, 5])); // 8.3
Python
def media_ponderada(notas, pesos):
    soma_notas = sum(n * p for n, p in zip(notas, pesos))
    soma_pesos = sum(pesos)
    return soma_notas / soma_pesos

print(media_ponderada([7, 8, 9], [2, 3, 5]))  # 8.3

10. Validação de CPF

Enunciado: Valide um CPF (11 dígitos) verificando seus dois dígitos verificadores.

Raciocínio: O algoritmo oficial soma os 9 primeiros dígitos multiplicados por pesos de 10 a 2. O dígito verificador é 11 menos o resto da divisão por 11 (se maior que 9, dígito = 0). O segundo dígito usa os 10 primeiros números com pesos de 11 a 2.

JavaScript
function validarCPF(cpf) {
  cpf = cpf.replace(/\D/g, '');
  if (cpf.length !== 11 || /^(\d)\1+$/.test(cpf)) return false;

  let soma = 0;
  for (let i = 0; i < 9; i++) soma += parseInt(cpf[i]) * (10 - i);
  let dig1 = 11 - (soma % 11);
  if (dig1 > 9) dig1 = 0;

  soma = 0;
  for (let i = 0; i < 10; i++) soma += parseInt(cpf[i]) * (11 - i);
  let dig2 = 11 - (soma % 11);
  if (dig2 > 9) dig2 = 0;

  return cpf[9] == dig1 && cpf[10] == dig2;
}

console.log(validarCPF('529.982.247-25')); // true ou false dependendo do CPF
Python
def validar_cpf(cpf):
    cpf = ''.join(filter(str.isdigit, cpf))
    if len(cpf) != 11 or cpf == cpf[0] * 11:
        return False

    soma = sum(int(cpf[i]) * (10 - i) for i in range(9))
    dig1 = 11 - (soma % 11)
    dig1 = 0 if dig1 > 9 else dig1

    soma = sum(int(cpf[i]) * (11 - i) for i in range(10))
    dig2 = 11 - (soma % 11)
    dig2 = 0 if dig2 > 9 else dig2

    return int(cpf[9]) == dig1 and int(cpf[10]) == dig2

print(validar_cpf('529.982.247-25'))  # True ou False

Perguntas Frequentes

O que é o desafio FizzBuzz?

FizzBuzz é um clássico desafio de lógica usado em entrevistas. O objetivo é imprimir números de 1 a 100, substituindo múltiplos de 3 por "Fizz", múltiplos de 5 por "Buzz", e múltiplos de ambos por "FizzBuzz". Ele testa condicionais e operador de módulo.

Qual a lógica para validar CPF?

A validação de CPF verifica se os 11 dígitos seguem o algoritmo oficial. O primeiro dígito verificador é calculado com pesos de 10 a 2 sobre os 9 primeiros dígitos. O segundo usa pesos de 11 a 2 sobre os 10 primeiros. Se os dígitos calculados coincidirem com os informados, o CPF é válido.

Qual a diferença entre FizzBuzz e Fibonacci?

FizzBuzz é um exercício de condicionais e laços de repetição para substituir números por palavras. Fibonacci é um algoritmo que gera uma sequência onde cada número é a soma dos dois anteriores, trabalhando conceitos de recursão e iteração.


Gostou dos desafios? Continue praticando com os exercícios de lógica para iniciantes, aprenda sobre estruturas de dados ou aprofunde-se em algoritmos em JavaScript.

Ver todos os estudos